@@ -33,11 +33,11 @@ pub enum LambdaRequest<'a> {
3333 cookies : Option < Vec < Cow < ' a , str > > > ,
3434 #[ serde( deserialize_with = "deserialize_headers" ) ]
3535 headers : http:: HeaderMap ,
36- #[ serde( default ) ]
36+ #[ serde( default , deserialize_with = "nullable_default" ) ]
3737 query_string_parameters : StrMap ,
38- #[ serde( default ) ]
38+ #[ serde( default , deserialize_with = "nullable_default" ) ]
3939 path_parameters : StrMap ,
40- #[ serde( default ) ]
40+ #[ serde( default , deserialize_with = "nullable_default" ) ]
4141 stage_variables : StrMap ,
4242 body : Option < Cow < ' a , str > > ,
4343 #[ serde( default ) ]
@@ -55,7 +55,7 @@ pub enum LambdaRequest<'a> {
5555 /// the `lambda.multi_value_headers.enabled` target group setting turned on
5656 #[ serde( default , deserialize_with = "deserialize_multi_value_headers" ) ]
5757 multi_value_headers : http:: HeaderMap ,
58- #[ serde( deserialize_with = "nullable_default" ) ]
58+ #[ serde( default , deserialize_with = "nullable_default" ) ]
5959 query_string_parameters : StrMap ,
6060 /// For alb events these are only present when
6161 /// the `lambda.multi_value_headers.enabled` target group setting turned on
@@ -75,7 +75,7 @@ pub enum LambdaRequest<'a> {
7575 headers : http:: HeaderMap ,
7676 #[ serde( default , deserialize_with = "deserialize_multi_value_headers" ) ]
7777 multi_value_headers : http:: HeaderMap ,
78- #[ serde( deserialize_with = "nullable_default" ) ]
78+ #[ serde( default , deserialize_with = "nullable_default" ) ]
7979 query_string_parameters : StrMap ,
8080 #[ serde( default , deserialize_with = "nullable_default" ) ]
8181 multi_value_query_string_parameters : StrMap ,
@@ -736,6 +736,29 @@ mod tests {
736736 ) ;
737737 }
738738
739+ #[ test]
740+ fn deserialize_apigw_v2_sam_local ( ) {
741+ // manually generated from AWS SAM CLI
742+ // Steps to recreate:
743+ // * sam init
744+ // * Use, Zip Python 3.9, and Hello World example
745+ // * Change the template to use HttpApi instead of Api
746+ // * Change the function code to return the Lambda event serialized
747+ // * sam local start-api
748+ // * Invoke the API
749+ let input = include_str ! ( "../tests/data/apigw_v2_sam_local.json" ) ;
750+ let result = from_str ( input) ;
751+ assert ! (
752+ result. is_ok( ) ,
753+ "event was not parsed as expected {:?} given {}" ,
754+ result,
755+ input
756+ ) ;
757+ let req = result. expect ( "failed to parse request" ) ;
758+ assert_eq ! ( req. method( ) , "GET" ) ;
759+ assert_eq ! ( req. uri( ) , "http://127.0.0.1:3000/hello" ) ;
760+ }
761+
739762 #[ test]
740763 fn deserialize_with_null ( ) {
741764 #[ derive( Debug , PartialEq , Deserialize ) ]
@@ -749,4 +772,18 @@ mod tests {
749772 Test { foo: HashMap :: new( ) }
750773 )
751774 }
775+
776+ #[ test]
777+ fn deserialize_with_missing ( ) {
778+ #[ derive( Debug , PartialEq , Deserialize ) ]
779+ struct Test {
780+ #[ serde( default , deserialize_with = "nullable_default" ) ]
781+ foo : HashMap < String , String > ,
782+ }
783+
784+ assert_eq ! (
785+ serde_json:: from_str:: <Test >( r#"{}"# ) . expect( "failed to deserialize" ) ,
786+ Test { foo: HashMap :: new( ) }
787+ )
788+ }
752789}
0 commit comments