rama_http/headers/forwarded/
mod.rs1pub use rama_net::forwarded::Forwarded;
2use rama_net::forwarded::ForwardedElement;
3
4mod via;
5#[doc(inline)]
6pub use via::Via;
7
8mod x_forwarded_for;
9#[doc(inline)]
10pub use x_forwarded_for::XForwardedFor;
11
12mod x_forwarded_host;
13#[doc(inline)]
14pub use x_forwarded_host::XForwardedHost;
15
16mod x_forwarded_proto;
17#[doc(inline)]
18pub use x_forwarded_proto::XForwardedProto;
19
20mod exotic_forward_ip;
21#[doc(inline)]
22pub use exotic_forward_ip::{CFConnectingIp, ClientIp, TrueClientIp, XClientIp, XRealIp};
23
24pub trait ForwardHeader: crate::headers::Header + IntoIterator<Item = ForwardedElement> {
27 fn try_from_forwarded<'a, I>(into_it: I) -> Option<Self>
31 where
32 I: IntoIterator<Item = &'a ForwardedElement>,
33 Self: Sized;
34}
35
36impl ForwardHeader for Forwarded {
37 fn try_from_forwarded<'a, I>(input: I) -> Option<Self>
38 where
39 I: IntoIterator<Item = &'a ForwardedElement>,
40 {
41 let mut it = input.into_iter();
42 let mut forwarded = Forwarded::new(it.next()?.clone());
43 forwarded.extend(it.cloned());
44 Some(forwarded)
45 }
46}
47
48#[cfg(test)]
49mod tests {
50 use super::*;
51
52 fn assert_forward_header<T: ForwardHeader>() {}
53
54 #[test]
55 fn test_forward_header_impls() {
56 assert_forward_header::<Forwarded>();
57 assert_forward_header::<Via>();
58 assert_forward_header::<XForwardedFor>();
59 assert_forward_header::<XForwardedHost>();
60 assert_forward_header::<XForwardedProto>();
61 assert_forward_header::<CFConnectingIp>();
62 assert_forward_header::<TrueClientIp>();
63 assert_forward_header::<XClientIp>();
64 assert_forward_header::<ClientIp>();
65 assert_forward_header::<XRealIp>();
66 }
67}