diff --git a/lambda-http/Cargo.toml b/lambda-http/Cargo.toml index fc93d88f..6e1a4989 100644 --- a/lambda-http/Cargo.toml +++ b/lambda-http/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "lambda_http" -version = "0.8.3" +version = "0.8.4" authors = [ "David Calavera ", "Harold Sun ", @@ -31,7 +31,7 @@ http-body = "0.4" hyper = "0.14" lambda_runtime = { path = "../lambda-runtime", version = "0.8.3" } serde = { version = "1.0", features = ["derive"] } -serde_json = "1.0" +serde_json = { version = "1.0", features = ["raw_value"] } serde_urlencoded = "0.7" tokio-stream = "0.1.2" mime = "0.3" diff --git a/lambda-http/src/deserializer.rs b/lambda-http/src/deserializer.rs index a77f68a5..cafc3d45 100644 --- a/lambda-http/src/deserializer.rs +++ b/lambda-http/src/deserializer.rs @@ -1,5 +1,14 @@ use crate::request::LambdaRequest; +#[cfg(feature = "alb")] +use aws_lambda_events::alb::AlbTargetGroupRequest; +#[cfg(feature = "apigw_rest")] +use aws_lambda_events::apigw::ApiGatewayProxyRequest; +#[cfg(feature = "apigw_http")] +use aws_lambda_events::apigw::ApiGatewayV2httpRequest; +#[cfg(feature = "apigw_websockets")] +use aws_lambda_events::apigw::ApiGatewayWebsocketProxyRequest; use serde::{de::Error, Deserialize}; +use serde_json::value::RawValue; const ERROR_CONTEXT: &str = "this function expects a JSON payload from Amazon API Gateway, Amazon Elastic Load Balancer, or AWS Lambda Function URLs, but the data doesn't match any of those services' events"; @@ -8,34 +17,22 @@ impl<'de> Deserialize<'de> for LambdaRequest { where D: serde::Deserializer<'de>, { - let content = match serde::__private::de::Content::deserialize(deserializer) { - Ok(content) => content, - Err(err) => return Err(err), - }; + let raw_value: Box = Box::deserialize(deserializer)?; + let data = raw_value.get(); #[cfg(feature = "apigw_rest")] - if let Ok(res) = aws_lambda_events::apigw::ApiGatewayProxyRequest::deserialize( - serde::__private::de::ContentRefDeserializer::::new(&content), - ) { + if let Ok(res) = serde_json::from_str::(data) { return Ok(LambdaRequest::ApiGatewayV1(res)); } #[cfg(feature = "apigw_http")] - if let Ok(res) = aws_lambda_events::apigw::ApiGatewayV2httpRequest::deserialize( - serde::__private::de::ContentRefDeserializer::::new(&content), - ) { + if let Ok(res) = serde_json::from_str::(data) { return Ok(LambdaRequest::ApiGatewayV2(res)); } #[cfg(feature = "alb")] - if let Ok(res) = - aws_lambda_events::alb::AlbTargetGroupRequest::deserialize(serde::__private::de::ContentRefDeserializer::< - D::Error, - >::new(&content)) - { + if let Ok(res) = serde_json::from_str::(data) { return Ok(LambdaRequest::Alb(res)); } #[cfg(feature = "apigw_websockets")] - if let Ok(res) = aws_lambda_events::apigw::ApiGatewayWebsocketProxyRequest::deserialize( - serde::__private::de::ContentRefDeserializer::::new(&content), - ) { + if let Ok(res) = serde_json::from_str::(data) { return Ok(LambdaRequest::WebSocket(res)); }