rama_http/utils/
header_value.rs

1use crate::{HeaderMap, Request, Response, header::AsHeaderName};
2
3/// Utility trait for getting header values from a request or response.
4pub trait HeaderValueGetter {
5    /// Get a header value as a string.
6    fn header_str<K>(&self, key: K) -> Result<&str, HeaderValueErr>
7    where
8        K: AsHeaderName + Copy;
9
10    /// Get a header value as a byte slice.
11    fn header_bytes<K>(&self, key: K) -> Result<&[u8], HeaderValueErr>
12    where
13        K: AsHeaderName + Copy;
14}
15
16impl<Body> HeaderValueGetter for Request<Body> {
17    fn header_str<K>(&self, key: K) -> Result<&str, HeaderValueErr>
18    where
19        K: AsHeaderName + Copy,
20    {
21        self.headers().header_str(key)
22    }
23
24    fn header_bytes<K>(&self, key: K) -> Result<&[u8], HeaderValueErr>
25    where
26        K: AsHeaderName + Copy,
27    {
28        self.headers().header_bytes(key)
29    }
30}
31
32impl<Body> HeaderValueGetter for Response<Body> {
33    fn header_str<K>(&self, key: K) -> Result<&str, HeaderValueErr>
34    where
35        K: AsHeaderName + Copy,
36    {
37        self.headers().header_str(key)
38    }
39
40    fn header_bytes<K>(&self, key: K) -> Result<&[u8], HeaderValueErr>
41    where
42        K: AsHeaderName + Copy,
43    {
44        self.headers().header_bytes(key)
45    }
46}
47
48impl HeaderValueGetter for HeaderMap {
49    fn header_str<K>(&self, key: K) -> Result<&str, HeaderValueErr>
50    where
51        K: AsHeaderName + Copy,
52    {
53        match self.get(key) {
54            Some(value) => value
55                .to_str()
56                .map_err(|_| HeaderValueErr::HeaderInvalid(key.as_str().to_owned())),
57            None => Err(HeaderValueErr::HeaderMissing(key.as_str().to_owned())),
58        }
59    }
60
61    fn header_bytes<K>(&self, key: K) -> Result<&[u8], HeaderValueErr>
62    where
63        K: AsHeaderName + Copy,
64    {
65        match self.get(key) {
66            Some(value) => Ok(value.as_bytes()),
67            None => Err(HeaderValueErr::HeaderMissing(key.as_str().to_owned())),
68        }
69    }
70}
71
72/// Error type for header value getters.
73#[derive(Debug)]
74pub enum HeaderValueErr {
75    /// The header was missing.
76    HeaderMissing(String),
77    /// The header was invalid.
78    HeaderInvalid(String),
79}
80
81impl std::fmt::Display for HeaderValueErr {
82    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
83        match self {
84            HeaderValueErr::HeaderMissing(key) => write!(f, "header missing: {}", key),
85            HeaderValueErr::HeaderInvalid(key) => write!(f, "header invalid: {}", key),
86        }
87    }
88}
89
90impl std::error::Error for HeaderValueErr {}