protocol/header/
blob_size.rs

1use headers::{Error, Header, HeaderName, HeaderValue};
2
3use once_cell::sync::Lazy;
4
5static X_BLOB_SIZE: Lazy<HeaderName> = Lazy::new(|| HeaderName::from_static("x-blob-size"));
6
7pub struct BlobSizeHeader(pub u64);
8
9impl Header for BlobSizeHeader {
10    fn name() -> &'static HeaderName {
11        &X_BLOB_SIZE
12    }
13
14    fn decode<'i, I>(values: &mut I) -> std::result::Result<Self, Error>
15    where
16        Self: Sized,
17        I: Iterator<Item = &'i HeaderValue>,
18    {
19        let first_value = values.next().ok_or_else(Error::invalid)?;
20        let value_str = first_value.to_str().map_err(|_| Error::invalid())?;
21        let size = value_str.parse::<u64>().map_err(|_| Error::invalid())?;
22
23        if values.next().is_some() {
24            tracing::debug!("x-blob-size doesn't support multiple assignment");
25            return Err(Error::invalid());
26        }
27
28        Ok(Self(size))
29    }
30
31    fn encode<E: Extend<HeaderValue>>(&self, values: &mut E) {
32        let value = HeaderValue::from_str(&format!("{}", self.0)).unwrap(); // Always safe
33        values.extend(vec![value].into_iter())
34    }
35}