Skip to content

Commit bcbbe84

Browse files
committed
perf: Remove unnecessary allocation and construction of a HashMap in Signature::parse
1 parent 8cbf4a2 commit bcbbe84

File tree

1 file changed

+17
-15
lines changed

1 file changed

+17
-15
lines changed

src/resources/webhook_events.rs

+17-15
Original file line numberDiff line numberDiff line change
@@ -565,21 +565,23 @@ struct Signature<'r> {
565565
#[cfg(feature = "webhook-events")]
566566
impl<'r> Signature<'r> {
567567
fn parse(raw: &'r str) -> Result<Signature<'r>, WebhookError> {
568-
let headers: HashMap<&str, &str> = raw
569-
.split(',')
570-
.map(|header| {
571-
let mut key_and_value = header.split('=');
572-
let key = key_and_value.next();
573-
let value = key_and_value.next();
574-
(key, value)
575-
})
576-
.filter_map(|(key, value)| match (key, value) {
577-
(Some(key), Some(value)) => Some((key, value)),
578-
_ => None,
579-
})
580-
.collect();
581-
let t = headers.get("t").ok_or(WebhookError::BadSignature)?;
582-
let v1 = headers.get("v1").ok_or(WebhookError::BadSignature)?;
568+
let mut t = None;
569+
let mut v1 = None;
570+
for header in raw.split(',') {
571+
let Some((key, value)) = header.split_once('=') else {
572+
continue;
573+
};
574+
575+
match key {
576+
"t" => t = Some(value),
577+
"v1" => v1 = Some(value),
578+
_ => (),
579+
}
580+
}
581+
let (Some(t), Some(v1)) = (t, v1) else {
582+
return Err(WebhookError::BadSignature);
583+
};
584+
583585
Ok(Signature { t: t.parse::<i64>().map_err(WebhookError::BadHeader)?, v1 })
584586
}
585587
}

0 commit comments

Comments
 (0)