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}