1use crate::{
2 body::{AsyncBody, Body},
3 client::ResponseFuture,
4 config::{
5 request::{RequestConfig, WithRequestConfig},
6 Configurable,
7 },
8 error::Error,
9};
10use http::{Request, Response};
11
12pub trait RequestExt<T> {
14 fn to_builder(&self) -> http::request::Builder;
19
20 fn send(self) -> Result<Response<Body>, Error>
40 where
41 T: Into<Body>;
42
43 fn send_async(self) -> ResponseFuture<'static>
48 where
49 T: Into<AsyncBody>;
50}
51
52impl<T> RequestExt<T> for Request<T> {
53 fn to_builder(&self) -> http::request::Builder {
54 let mut builder = Request::builder()
55 .method(self.method().clone())
56 .uri(self.uri().clone())
57 .version(self.version());
58
59 *builder.headers_mut().unwrap() = self.headers().clone();
60
61 if let Some(config) = self.extensions().get::<RequestConfig>() {
62 builder = builder.extension(config.clone());
63 }
64
65 #[cfg(feature = "cookies")]
66 {
67 if let Some(cookie_jar) = self.extensions().get::<crate::cookies::CookieJar>() {
68 builder = builder.extension(cookie_jar.clone());
69 }
70 }
71
72 builder
73 }
74
75 fn send(self) -> Result<Response<Body>, Error>
76 where
77 T: Into<Body>,
78 {
79 crate::send(self)
80 }
81
82 fn send_async(self) -> ResponseFuture<'static>
83 where
84 T: Into<AsyncBody>,
85 {
86 crate::send_async(self)
87 }
88}
89
90impl Configurable for http::request::Builder {
91 #[cfg(feature = "cookies")]
92 fn cookie_jar(self, cookie_jar: crate::cookies::CookieJar) -> Self {
93 self.extension(cookie_jar)
94 }
95}
96
97impl WithRequestConfig for http::request::Builder {
98 #[inline]
99 fn with_config(mut self, f: impl FnOnce(&mut RequestConfig)) -> Self {
100 if let Some(extensions) = self.extensions_mut() {
101 if let Some(config) = extensions.get_mut() {
102 f(config);
103 } else {
104 extensions.insert(RequestConfig::default());
105 f(extensions.get_mut().unwrap());
106 }
107 }
108
109 self
110 }
111}