Skip to content

Commit 5c15750

Browse files
author
Filip Kieres
authored
fix: add client context and icognito identity to runtime context (#382)
1 parent 3c3a567 commit 5c15750

File tree

1 file changed

+119
-1
lines changed

1 file changed

+119
-1
lines changed

lambda-runtime/src/types.rs

Lines changed: 119 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,15 +57,18 @@ struct MobileClientIdentity(String);
5757
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]
5858
pub struct ClientContext {
5959
/// Information about the mobile application invoking the function.
60+
#[serde(default)]
6061
pub client: ClientApplication,
6162
/// Custom properties attached to the mobile event context.
63+
#[serde(default)]
6264
pub custom: HashMap<String, String>,
6365
/// Environment settings from the mobile client.
66+
#[serde(default)]
6467
pub environment: HashMap<String, String>,
6568
}
6669

6770
/// AWS Mobile SDK client fields.
68-
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]
71+
#[derive(Serialize, Deserialize, Default, Clone, Debug, PartialEq)]
6972
#[serde(rename_all = "camelCase")]
7073
pub struct ClientApplication {
7174
/// The mobile app installation id
@@ -119,6 +122,18 @@ pub struct Context {
119122
impl TryFrom<HeaderMap> for Context {
120123
type Error = Error;
121124
fn try_from(headers: HeaderMap) -> Result<Self, Self::Error> {
125+
let client_context: Option<ClientContext> = if let Some(value) = headers.get("lambda-runtime-client-context") {
126+
serde_json::from_str(value.to_str()?)?
127+
} else {
128+
None
129+
};
130+
131+
let identity: Option<CognitoIdentity> = if let Some(value) = headers.get("lambda-runtime-cognito-identity") {
132+
serde_json::from_str(value.to_str()?)?
133+
} else {
134+
None
135+
};
136+
122137
let ctx = Context {
123138
request_id: headers
124139
.get("lambda-runtime-aws-request-id")
@@ -142,8 +157,11 @@ impl TryFrom<HeaderMap> for Context {
142157
.unwrap_or(&HeaderValue::from_static(""))
143158
.to_str()?
144159
.to_owned(),
160+
client_context,
161+
identity,
145162
..Default::default()
146163
};
164+
147165
Ok(ctx)
148166
}
149167
}
@@ -175,6 +193,70 @@ mod test {
175193
assert!(tried.is_ok());
176194
}
177195

196+
#[test]
197+
fn context_with_client_context_resolves() {
198+
let mut custom = HashMap::new();
199+
custom.insert("key".to_string(), "value".to_string());
200+
let mut environment = HashMap::new();
201+
environment.insert("key".to_string(), "value".to_string());
202+
let client_context = ClientContext {
203+
client: ClientApplication {
204+
installation_id: String::new(),
205+
app_title: String::new(),
206+
app_version_name: String::new(),
207+
app_version_code: String::new(),
208+
app_package_name: String::new(),
209+
},
210+
custom,
211+
environment,
212+
};
213+
let client_context_str = serde_json::to_string(&client_context).unwrap();
214+
let mut headers = HeaderMap::new();
215+
headers.insert("lambda-runtime-aws-request-id", HeaderValue::from_static("my-id"));
216+
headers.insert("lambda-runtime-deadline-ms", HeaderValue::from_static("123"));
217+
headers.insert(
218+
"lambda-runtime-client-context",
219+
HeaderValue::from_str(&client_context_str).unwrap(),
220+
);
221+
let tried = Context::try_from(headers);
222+
assert!(tried.is_ok());
223+
let tried = tried.unwrap();
224+
assert!(tried.client_context.is_some());
225+
assert_eq!(tried.client_context.unwrap(), client_context);
226+
}
227+
228+
#[test]
229+
fn context_with_empty_client_context_resolves() {
230+
let mut headers = HeaderMap::new();
231+
headers.insert("lambda-runtime-aws-request-id", HeaderValue::from_static("my-id"));
232+
headers.insert("lambda-runtime-deadline-ms", HeaderValue::from_static("123"));
233+
headers.insert("lambda-runtime-client-context", HeaderValue::from_static("{}"));
234+
let tried = Context::try_from(headers);
235+
assert!(tried.is_ok());
236+
assert!(tried.unwrap().client_context.is_some());
237+
}
238+
239+
#[test]
240+
fn context_with_identity_resolves() {
241+
let cognito_identity = CognitoIdentity {
242+
identity_id: String::new(),
243+
identity_pool_id: String::new(),
244+
};
245+
let cognito_identity_str = serde_json::to_string(&cognito_identity).unwrap();
246+
let mut headers = HeaderMap::new();
247+
headers.insert("lambda-runtime-aws-request-id", HeaderValue::from_static("my-id"));
248+
headers.insert("lambda-runtime-deadline-ms", HeaderValue::from_static("123"));
249+
headers.insert(
250+
"lambda-runtime-cognito-identity",
251+
HeaderValue::from_str(&cognito_identity_str).unwrap(),
252+
);
253+
let tried = Context::try_from(headers);
254+
assert!(tried.is_ok());
255+
let tried = tried.unwrap();
256+
assert!(tried.identity.is_some());
257+
assert_eq!(tried.identity.unwrap(), cognito_identity);
258+
}
259+
178260
#[test]
179261
fn context_with_bad_deadline_type_is_err() {
180262
let mut headers = HeaderMap::new();
@@ -192,6 +274,42 @@ mod test {
192274
assert!(tried.is_err());
193275
}
194276

277+
#[test]
278+
fn context_with_bad_client_context_is_err() {
279+
let mut headers = HeaderMap::new();
280+
headers.insert("lambda-runtime-aws-request-id", HeaderValue::from_static("my-id"));
281+
headers.insert("lambda-runtime-deadline-ms", HeaderValue::from_static("123"));
282+
headers.insert(
283+
"lambda-runtime-client-context",
284+
HeaderValue::from_static("BAD-Type,not JSON"),
285+
);
286+
let tried = Context::try_from(headers);
287+
assert!(tried.is_err());
288+
}
289+
290+
#[test]
291+
fn context_with_empty_identity_is_err() {
292+
let mut headers = HeaderMap::new();
293+
headers.insert("lambda-runtime-aws-request-id", HeaderValue::from_static("my-id"));
294+
headers.insert("lambda-runtime-deadline-ms", HeaderValue::from_static("123"));
295+
headers.insert("lambda-runtime-cognito-identity", HeaderValue::from_static("{}"));
296+
let tried = Context::try_from(headers);
297+
assert!(tried.is_err());
298+
}
299+
300+
#[test]
301+
fn context_with_bad_identity_is_err() {
302+
let mut headers = HeaderMap::new();
303+
headers.insert("lambda-runtime-aws-request-id", HeaderValue::from_static("my-id"));
304+
headers.insert("lambda-runtime-deadline-ms", HeaderValue::from_static("123"));
305+
headers.insert(
306+
"lambda-runtime-cognito-identity",
307+
HeaderValue::from_static("BAD-Type,not JSON"),
308+
);
309+
let tried = Context::try_from(headers);
310+
assert!(tried.is_err());
311+
}
312+
195313
#[test]
196314
#[should_panic]
197315
#[allow(unused_must_use)]

0 commit comments

Comments
 (0)