Skip to main content

cratestack_axum/idempotency/
parse.rs

1//! `Idempotency-Key` header parsing.
2
3use cratestack_core::CoolError;
4
5/// Parse the `Idempotency-Key` request header. Returns `Ok(None)` if absent.
6/// The key must be ASCII and reasonably short to avoid storage abuse.
7pub fn parse_idempotency_key(headers: &http::HeaderMap) -> Result<Option<String>, CoolError> {
8    let Some(value) = headers.get("idempotency-key") else {
9        return Ok(None);
10    };
11    let raw = value
12        .to_str()
13        .map_err(|_| CoolError::BadRequest("Idempotency-Key must be ASCII".to_owned()))?
14        .trim();
15    if raw.is_empty() {
16        return Err(CoolError::BadRequest(
17            "Idempotency-Key must not be empty".to_owned(),
18        ));
19    }
20    if raw.len() > 255 {
21        return Err(CoolError::BadRequest(
22            "Idempotency-Key must be at most 255 characters".to_owned(),
23        ));
24    }
25    Ok(Some(raw.to_owned()))
26}