rama_http/utils/
header_value.rs1use crate::{HeaderMap, Request, Response, header::AsHeaderName};
2
3pub trait HeaderValueGetter {
5 fn header_str<K>(&self, key: K) -> Result<&str, HeaderValueErr>
7 where
8 K: AsHeaderName + Copy;
9
10 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#[derive(Debug)]
74pub enum HeaderValueErr {
75 HeaderMissing(String),
77 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 {}