thegraph_headers/http_ext.rs
1use headers::{Header, HeaderMapExt as _};
2
3/// An extension trait adding "typed" methods to `http::request::Builder` and
4/// `http::response::Builder`.
5pub trait HttpBuilderExt: sealed::Sealed {
6 /// Add a typed `Header` to the builder.
7 ///
8 /// This method is a convenience wrapper around `headers::HeaderMapExt::typed_insert`.
9 ///
10 /// # Example for `http::request::Builder`
11 ///
12 /// ```rust
13 /// # use headers::ContentType;
14 /// use thegraph_headers::HttpBuilderExt as _;
15 ///
16 /// let request = http::request::Builder::new()
17 /// .header_typed(ContentType::text())
18 /// .body(())
19 /// .expect("failed to build request");
20 ///
21 /// assert!(request.headers().get("content-type").is_some());
22 /// ```
23 ///
24 /// # Example for `http::response::Builder`
25 ///
26 /// ```rust
27 /// # use headers::ContentType;
28 /// use thegraph_headers::HttpBuilderExt as _;
29 ///
30 /// let response = http::response::Builder::new()
31 /// .header_typed(ContentType::text())
32 /// .body(())
33 /// .expect("failed to build response");
34 ///
35 /// assert!(response.headers().get("content-type").is_some());
36 /// ```
37 fn header_typed<H: Header>(self, header: H) -> Self;
38}
39
40impl HttpBuilderExt for http::response::Builder {
41 #[inline]
42 fn header_typed<H: Header>(mut self, header: H) -> Self {
43 // When the builder has error, skip adding the header
44 if let Some(headers) = self.headers_mut() {
45 headers.typed_insert(header);
46 }
47
48 self
49 }
50}
51
52impl HttpBuilderExt for http::request::Builder {
53 #[inline]
54 fn header_typed<H: Header>(mut self, header: H) -> Self {
55 // When the builder has error, skip adding the header
56 if let Some(headers) = self.headers_mut() {
57 headers.typed_insert(header);
58 }
59
60 self
61 }
62}
63
64/// Sealed trait to prevent downstream implementations of `HttpBuilderExt`.
65mod sealed {
66 pub trait Sealed {}
67 impl Sealed for http::request::Builder {}
68 impl Sealed for http::response::Builder {}
69}