Skip to content

Commit fde1d37

Browse files
authored
Tighten lambda-http event deserializer (#788)
* Tighten lambda-http event deserializer * Add 'deny_unknown_fields' for alb request * Removed 'deny_unknown_fields' and make request_context mandatory for 'ApiGatewayProxyRequest' and 'ApiGatewayWebsocketProxyRequest'
1 parent b8880d2 commit fde1d37

File tree

3 files changed

+38
-11
lines changed

3 files changed

+38
-11
lines changed

lambda-events/src/event/apigw/mod.rs

+4-5
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use std::collections::HashMap;
1515
#[serde(rename_all = "camelCase")]
1616
pub struct ApiGatewayProxyRequest<T1 = Value>
1717
where
18-
T1: DeserializeOwned,
18+
T1: DeserializeOwned + Default,
1919
T1: Serialize,
2020
{
2121
/// The resource path defined in API Gateway
@@ -43,7 +43,6 @@ where
4343
#[serde(deserialize_with = "deserialize_lambda_map")]
4444
#[serde(default)]
4545
pub stage_variables: HashMap<String, String>,
46-
#[serde(default)]
4746
#[serde(bound = "")]
4847
pub request_context: ApiGatewayProxyRequestContext<T1>,
4948
#[serde(default)]
@@ -335,9 +334,9 @@ pub struct ApiGatewayRequestIdentity {
335334
#[serde(rename_all = "camelCase")]
336335
pub struct ApiGatewayWebsocketProxyRequest<T1 = Value, T2 = Value>
337336
where
338-
T1: DeserializeOwned,
337+
T1: DeserializeOwned + Default,
339338
T1: Serialize,
340-
T2: DeserializeOwned,
339+
T2: DeserializeOwned + Default,
341340
T2: Serialize,
342341
{
343342
/// The resource path defined in API Gateway
@@ -367,7 +366,7 @@ where
367366
#[serde(deserialize_with = "deserialize_lambda_map")]
368367
#[serde(default)]
369368
pub stage_variables: HashMap<String, String>,
370-
#[serde(bound = "", default)]
369+
#[serde(bound = "")]
371370
pub request_context: ApiGatewayWebsocketProxyRequestContext<T1, T2>,
372371
#[serde(default)]
373372
pub body: Option<String>,

lambda-events/src/fixtures/example-sqs-event.json

+1-2
Original file line numberDiff line numberDiff line change
@@ -37,5 +37,4 @@
3737
}
3838
}
3939
]
40-
}
41-
40+
}

lambda-http/src/deserializer.rs

+33-4
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ mod tests {
5656
fn test_deserialize_apigw_rest() {
5757
let data = include_bytes!("../../lambda-events/src/fixtures/example-apigw-request.json");
5858

59-
let req: LambdaRequest = serde_json::from_slice(data).expect("failed to deserialze apigw rest data");
59+
let req: LambdaRequest = serde_json::from_slice(data).expect("failed to deserialize apigw rest data");
6060
match req {
6161
LambdaRequest::ApiGatewayV1(req) => {
6262
assert_eq!("12345678912", req.request_context.account_id.unwrap());
@@ -69,7 +69,7 @@ mod tests {
6969
fn test_deserialize_apigw_http() {
7070
let data = include_bytes!("../../lambda-events/src/fixtures/example-apigw-v2-request-iam.json");
7171

72-
let req: LambdaRequest = serde_json::from_slice(data).expect("failed to deserialze apigw http data");
72+
let req: LambdaRequest = serde_json::from_slice(data).expect("failed to deserialize apigw http data");
7373
match req {
7474
LambdaRequest::ApiGatewayV2(req) => {
7575
assert_eq!("123456789012", req.request_context.account_id.unwrap());
@@ -84,7 +84,7 @@ mod tests {
8484
"../../lambda-events/src/fixtures/example-alb-lambda-target-request-multivalue-headers.json"
8585
);
8686

87-
let req: LambdaRequest = serde_json::from_slice(data).expect("failed to deserialze alb rest data");
87+
let req: LambdaRequest = serde_json::from_slice(data).expect("failed to deserialize alb rest data");
8888
match req {
8989
LambdaRequest::Alb(req) => {
9090
assert_eq!(
@@ -101,12 +101,41 @@ mod tests {
101101
let data =
102102
include_bytes!("../../lambda-events/src/fixtures/example-apigw-websocket-request-without-method.json");
103103

104-
let req: LambdaRequest = serde_json::from_slice(data).expect("failed to deserialze apigw websocket data");
104+
let req: LambdaRequest = serde_json::from_slice(data).expect("failed to deserialize apigw websocket data");
105105
match req {
106106
LambdaRequest::WebSocket(req) => {
107107
assert_eq!("CONNECT", req.request_context.event_type.unwrap());
108108
}
109109
other => panic!("unexpected request variant: {:?}", other),
110110
}
111111
}
112+
113+
#[test]
114+
#[cfg(feature = "pass_through")]
115+
fn test_deserialize_bedrock_agent() {
116+
let data = include_bytes!("../../lambda-events/src/fixtures/example-bedrock-agent-runtime-event.json");
117+
118+
let req: LambdaRequest =
119+
serde_json::from_slice(data).expect("failed to deserialize bedrock agent request data");
120+
match req {
121+
LambdaRequest::PassThrough(req) => {
122+
assert_eq!(String::from_utf8_lossy(data), req);
123+
}
124+
other => panic!("unexpected request variant: {:?}", other),
125+
}
126+
}
127+
128+
#[test]
129+
#[cfg(feature = "pass_through")]
130+
fn test_deserialize_sqs() {
131+
let data = include_bytes!("../../lambda-events/src/fixtures/example-sqs-event.json");
132+
133+
let req: LambdaRequest = serde_json::from_slice(data).expect("failed to deserialize sqs event data");
134+
match req {
135+
LambdaRequest::PassThrough(req) => {
136+
assert_eq!(String::from_utf8_lossy(data), req);
137+
}
138+
other => panic!("unexpected request variant: {:?}", other),
139+
}
140+
}
112141
}

0 commit comments

Comments
 (0)