protocol/header/
blob_size.rs1use 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(); values.extend(vec![value].into_iter())
34 }
35}