@@ -33,11 +33,11 @@ pub enum LambdaRequest<'a> {
33
33
cookies : Option < Vec < Cow < ' a , str > > > ,
34
34
#[ serde( deserialize_with = "deserialize_headers" ) ]
35
35
headers : http:: HeaderMap ,
36
- #[ serde( default ) ]
36
+ #[ serde( default , deserialize_with = "nullable_default" ) ]
37
37
query_string_parameters : StrMap ,
38
- #[ serde( default ) ]
38
+ #[ serde( default , deserialize_with = "nullable_default" ) ]
39
39
path_parameters : StrMap ,
40
- #[ serde( default ) ]
40
+ #[ serde( default , deserialize_with = "nullable_default" ) ]
41
41
stage_variables : StrMap ,
42
42
body : Option < Cow < ' a , str > > ,
43
43
#[ serde( default ) ]
@@ -55,7 +55,7 @@ pub enum LambdaRequest<'a> {
55
55
/// the `lambda.multi_value_headers.enabled` target group setting turned on
56
56
#[ serde( default , deserialize_with = "deserialize_multi_value_headers" ) ]
57
57
multi_value_headers : http:: HeaderMap ,
58
- #[ serde( deserialize_with = "nullable_default" ) ]
58
+ #[ serde( default , deserialize_with = "nullable_default" ) ]
59
59
query_string_parameters : StrMap ,
60
60
/// For alb events these are only present when
61
61
/// the `lambda.multi_value_headers.enabled` target group setting turned on
@@ -75,7 +75,7 @@ pub enum LambdaRequest<'a> {
75
75
headers : http:: HeaderMap ,
76
76
#[ serde( default , deserialize_with = "deserialize_multi_value_headers" ) ]
77
77
multi_value_headers : http:: HeaderMap ,
78
- #[ serde( deserialize_with = "nullable_default" ) ]
78
+ #[ serde( default , deserialize_with = "nullable_default" ) ]
79
79
query_string_parameters : StrMap ,
80
80
#[ serde( default , deserialize_with = "nullable_default" ) ]
81
81
multi_value_query_string_parameters : StrMap ,
@@ -736,6 +736,29 @@ mod tests {
736
736
) ;
737
737
}
738
738
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
+
739
762
#[ test]
740
763
fn deserialize_with_null ( ) {
741
764
#[ derive( Debug , PartialEq , Deserialize ) ]
@@ -749,4 +772,18 @@ mod tests {
749
772
Test { foo: HashMap :: new( ) }
750
773
)
751
774
}
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
+ }
752
789
}
0 commit comments