spire_core/http/
request_ext.rs1use bytes::Bytes;
4
5use super::meta::RequestMeta;
6use crate::crawler::{Attempt, Depth, Tag};
7use crate::identity::Identity;
8
9pub type Request<B = Bytes> = ::http::Request<B>;
11
12pub trait RequestExt {
31 fn tag(&self) -> Option<&Tag>;
33
34 fn depth(&self) -> Depth;
36
37 fn attempt(&self) -> Attempt;
39
40 fn identity(&self) -> Option<&Identity>;
43}
44
45impl<B> RequestExt for ::http::Request<B> {
46 fn tag(&self) -> Option<&Tag> {
47 self.extensions().get::<RequestMeta>()?.tag.as_ref()
48 }
49
50 fn depth(&self) -> Depth {
51 self.extensions()
52 .get::<RequestMeta>()
53 .map(|meta| meta.depth)
54 .unwrap_or_default()
55 }
56
57 fn attempt(&self) -> Attempt {
58 self.extensions()
59 .get::<RequestMeta>()
60 .map(|meta| meta.attempt)
61 .unwrap_or_default()
62 }
63
64 fn identity(&self) -> Option<&Identity> {
65 self.extensions().get::<RequestMeta>()?.identity.as_ref()
66 }
67}
68
69#[cfg(test)]
70mod tests {
71 use super::*;
72
73 #[test]
74 fn request_metadata_defaults() {
75 let request = Request::new(());
76 assert_eq!(request.tag(), None);
77 assert_eq!(request.depth(), Depth::ROOT);
78 assert_eq!(request.attempt(), Attempt::FIRST);
79 }
80
81 #[test]
82 fn request_metadata_from_extensions() {
83 let mut request = Request::new(());
84 request.extensions_mut().insert(RequestMeta {
85 tag: Some(Tag::from_static("page")),
86 depth: Depth::new(2),
87 attempt: Attempt::FIRST,
88 identity: None,
89 });
90 assert_eq!(request.tag(), Some(&Tag::from("page")));
91 assert_eq!(request.depth().child(), Depth::new(3));
92 }
93}