boluo_core/
request.rs

1//! HTTP 请求。
2
3use std::convert::TryFrom;
4
5use http::header::{HeaderMap, HeaderName, HeaderValue};
6use http::method::Method;
7use http::version::Version;
8use http::{Extensions, Result, Uri};
9use sync_wrapper::SyncWrapper;
10
11use crate::body::Body;
12
13/// HTTP 请求。
14///
15/// HTTP 请求由头部和可选的主体组成。主体是泛型的,允许任意类型来表示 HTTP 请求的主体。
16#[derive(Default)]
17pub struct Request<T = Body> {
18    head: RequestParts,
19    body: SyncWrapper<T>,
20}
21
22/// HTTP 请求的头部。
23///
24/// HTTP 请求的头部由方法、URI、版本、一组标头和扩展组成。
25#[derive(Default, Clone)]
26pub struct RequestParts {
27    /// HTTP 请求的方法。
28    pub method: Method,
29    /// HTTP 请求的 URI。
30    pub uri: Uri,
31    /// HTTP 请求的版本。
32    pub version: Version,
33    /// HTTP 请求的标头集。
34    pub headers: HeaderMap<HeaderValue>,
35    /// HTTP 请求的扩展。
36    pub extensions: Extensions,
37}
38
39/// HTTP 请求的构建器。
40#[derive(Debug)]
41pub struct RequestBuilder {
42    inner: Result<Request<()>>,
43}
44
45impl Request<()> {
46    /// 创建新的构建器以构建请求。
47    ///
48    /// # 例子
49    ///
50    /// ```
51    /// use boluo_core::request::Request;
52    ///
53    /// let request = Request::builder()
54    ///     .method("GET")
55    ///     .uri("https://www.rust-lang.org/")
56    ///     .header("X-Custom-Foo", "Bar")
57    ///     .body(())
58    ///     .unwrap();
59    /// ```
60    #[inline]
61    pub fn builder() -> RequestBuilder {
62        RequestBuilder::new()
63    }
64}
65
66impl<T> Request<T> {
67    /// 使用给定的主体创建一个空白的请求。
68    ///
69    /// 此请求的头部将被设置为默认值。
70    ///
71    /// # 例子
72    ///
73    /// ```
74    /// use boluo_core::http::Method;
75    /// use boluo_core::request::Request;
76    ///
77    /// let mut request = Request::new("hello world");
78    ///
79    /// assert_eq!(*request.method(), Method::GET);
80    /// assert_eq!(*request.body_mut(), "hello world");
81    /// ```
82    #[inline]
83    pub fn new(body: T) -> Request<T> {
84        Request {
85            head: RequestParts::new(),
86            body: SyncWrapper::new(body),
87        }
88    }
89
90    /// 使用给定的头部和主体创建请求。
91    ///
92    /// # 例子
93    ///
94    /// ```
95    /// use boluo_core::http::Method;
96    /// use boluo_core::request::Request;
97    ///
98    /// let request = Request::new("hello world");
99    /// let (mut parts, body) = request.into_inner();
100    ///
101    /// parts.method = Method::POST;
102    /// let mut request = Request::from_parts(parts, body);
103    ///
104    /// assert_eq!(request.method(), Method::POST);
105    /// assert_eq!(*request.body_mut(), "hello world");
106    /// ```
107    #[inline]
108    pub fn from_parts(parts: RequestParts, body: T) -> Request<T> {
109        Request {
110            head: parts,
111            body: SyncWrapper::new(body),
112        }
113    }
114
115    /// 获取请求的 HTTP 方法的引用。
116    ///
117    /// # 例子
118    ///
119    /// ```
120    /// use boluo_core::http::Method;
121    /// use boluo_core::request::Request;
122    ///
123    /// let request: Request<()> = Request::default();
124    ///
125    /// assert_eq!(*request.method(), Method::GET);
126    /// ```
127    #[inline]
128    pub fn method(&self) -> &Method {
129        &self.head.method
130    }
131
132    /// 获取请求的 HTTP 方法的可变引用。
133    ///
134    /// # 例子
135    ///
136    /// ```
137    /// use boluo_core::http::Method;
138    /// use boluo_core::request::Request;
139    ///
140    /// let mut request: Request<()> = Request::default();
141    /// *request.method_mut() = Method::PUT;
142    ///
143    /// assert_eq!(*request.method(), Method::PUT);
144    /// ```
145    #[inline]
146    pub fn method_mut(&mut self) -> &mut Method {
147        &mut self.head.method
148    }
149
150    /// 获取请求的 URI 的引用。
151    ///
152    /// # 例子
153    ///
154    /// ```
155    /// use boluo_core::request::Request;
156    ///
157    /// let request: Request<()> = Request::default();
158    ///
159    /// assert_eq!(*request.uri(), "/");
160    /// ```
161    #[inline]
162    pub fn uri(&self) -> &Uri {
163        &self.head.uri
164    }
165
166    /// 获取请求的 URI 的可变引用。
167    ///
168    /// # 例子
169    ///
170    /// ```
171    /// use boluo_core::request::Request;
172    ///
173    /// let mut request: Request<()> = Request::default();
174    /// *request.uri_mut() = "/hello".parse().unwrap();
175    ///
176    /// assert_eq!(*request.uri(), "/hello");
177    /// ```
178    #[inline]
179    pub fn uri_mut(&mut self) -> &mut Uri {
180        &mut self.head.uri
181    }
182
183    /// 获取请求的 HTTP 版本。
184    ///
185    /// # 例子
186    ///
187    /// ```
188    /// use boluo_core::http::Version;
189    /// use boluo_core::request::Request;
190    ///
191    /// let request: Request<()> = Request::default();
192    ///
193    /// assert_eq!(request.version(), Version::HTTP_11);
194    /// ```
195    #[inline]
196    pub fn version(&self) -> Version {
197        self.head.version
198    }
199
200    /// 获取请求的 HTTP 版本的可变引用。
201    ///
202    /// # 例子
203    ///
204    /// ```
205    /// use boluo_core::http::Version;
206    /// use boluo_core::request::Request;
207    ///
208    /// let mut request: Request<()> = Request::default();
209    /// *request.version_mut() = Version::HTTP_2;
210    ///
211    /// assert_eq!(request.version(), Version::HTTP_2);
212    /// ```
213    #[inline]
214    pub fn version_mut(&mut self) -> &mut Version {
215        &mut self.head.version
216    }
217
218    /// 获取请求的标头集的引用。
219    ///
220    /// # 例子
221    ///
222    /// ```
223    /// use boluo_core::request::Request;
224    ///
225    /// let request: Request<()> = Request::default();
226    ///
227    /// assert!(request.headers().is_empty());
228    /// ```
229    #[inline]
230    pub fn headers(&self) -> &HeaderMap<HeaderValue> {
231        &self.head.headers
232    }
233
234    /// 获取请求的标头集的可变引用。
235    ///
236    /// # 例子
237    ///
238    /// ```
239    /// use boluo_core::http::header::*;
240    /// use boluo_core::request::Request;
241    ///
242    /// let mut request: Request<()> = Request::default();
243    /// request.headers_mut().insert(HOST, HeaderValue::from_static("world"));
244    ///
245    /// assert!(!request.headers().is_empty());
246    /// ```
247    #[inline]
248    pub fn headers_mut(&mut self) -> &mut HeaderMap<HeaderValue> {
249        &mut self.head.headers
250    }
251
252    /// 获取请求的扩展的引用。
253    ///
254    /// # 例子
255    ///
256    /// ```
257    /// use boluo_core::request::Request;
258    ///
259    /// let request: Request<()> = Request::default();
260    ///
261    /// assert!(request.extensions().get::<i32>().is_none());
262    /// ```
263    #[inline]
264    pub fn extensions(&self) -> &Extensions {
265        &self.head.extensions
266    }
267
268    /// 获取请求的扩展的可变引用。
269    ///
270    /// # 例子
271    ///
272    /// ```
273    /// use boluo_core::request::Request;
274    ///
275    /// let mut request: Request<()> = Request::default();
276    /// request.extensions_mut().insert("hello");
277    ///
278    /// assert_eq!(request.extensions().get(), Some(&"hello"));
279    /// ```
280    #[inline]
281    pub fn extensions_mut(&mut self) -> &mut Extensions {
282        &mut self.head.extensions
283    }
284
285    /// 获取请求的主体的可变引用。
286    ///
287    /// # 例子
288    ///
289    /// ```
290    /// use boluo_core::request::Request;
291    ///
292    /// let mut request: Request<String> = Request::default();
293    /// request.body_mut().push_str("hello world");
294    ///
295    /// assert!(!request.body_mut().is_empty());
296    /// ```
297    #[inline]
298    pub fn body_mut(&mut self) -> &mut T {
299        self.body.get_mut()
300    }
301
302    /// 消耗请求,返回请求的主体。
303    ///
304    /// # 例子
305    ///
306    /// ```
307    /// use boluo_core::request::Request;
308    ///
309    /// let request = Request::new(10);
310    /// let body = request.into_body();
311    ///
312    /// assert_eq!(body, 10);
313    /// ```
314    #[inline]
315    pub fn into_body(self) -> T {
316        self.body.into_inner()
317    }
318
319    /// 获取请求的头部的引用。
320    ///
321    /// # 例子
322    ///
323    /// ```
324    /// use boluo_core::http::Method;
325    /// use boluo_core::request::Request;
326    ///
327    /// let request: Request<()> = Request::default();
328    ///
329    /// assert_eq!(request.parts().method, Method::GET);
330    /// ```
331    #[inline]
332    pub fn parts(&self) -> &RequestParts {
333        &self.head
334    }
335
336    /// 获取请求的头部的可变引用。
337    ///
338    /// # 例子
339    ///
340    /// ```
341    /// use boluo_core::http::Method;
342    /// use boluo_core::request::Request;
343    ///
344    /// let mut request: Request<()> = Request::default();
345    /// request.parts_mut().method = Method::PUT;
346    ///
347    /// assert_eq!(*request.method(), Method::PUT);
348    /// ```
349    #[inline]
350    pub fn parts_mut(&mut self) -> &mut RequestParts {
351        &mut self.head
352    }
353
354    /// 消耗请求,返回请求的头部。
355    ///
356    /// # 例子
357    ///
358    /// ```
359    /// use boluo_core::http::Method;
360    /// use boluo_core::request::Request;
361    ///
362    /// let request = Request::new(());
363    /// let parts = request.into_parts();
364    ///
365    /// assert_eq!(parts.method, Method::GET);
366    /// ```
367    #[inline]
368    pub fn into_parts(self) -> RequestParts {
369        self.head
370    }
371
372    /// 消耗请求,返回请求的头部和主体。
373    ///
374    /// # 例子
375    ///
376    /// ```
377    /// use boluo_core::http::Method;
378    /// use boluo_core::request::Request;
379    ///
380    /// let request = Request::new(());
381    /// let (parts, body) = request.into_inner();
382    ///
383    /// assert_eq!(parts.method, Method::GET);
384    /// assert_eq!(body, ());
385    /// ```
386    #[inline]
387    pub fn into_inner(self) -> (RequestParts, T) {
388        (self.head, self.body.into_inner())
389    }
390
391    /// 消耗请求,返回带有给定主体的新请求,其主体为传入闭包的返回值。
392    ///
393    /// # 例子
394    ///
395    /// ```
396    /// use boluo_core::request::Request;
397    ///
398    /// let request = Request::builder().body("some string").unwrap();
399    /// let mut mapped_request: Request<&[u8]> = request.map(|b| {
400    ///   assert_eq!(b, "some string");
401    ///   b.as_bytes()
402    /// });
403    ///
404    /// assert_eq!(mapped_request.body_mut(), &"some string".as_bytes());
405    /// ```
406    #[inline]
407    pub fn map<F, U>(self, f: F) -> Request<U>
408    where
409        F: FnOnce(T) -> U,
410    {
411        Request {
412            body: SyncWrapper::new(f(self.body.into_inner())),
413            head: self.head,
414        }
415    }
416}
417
418impl<T: std::fmt::Debug> std::fmt::Debug for Request<T> {
419    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
420        f.debug_struct("Request")
421            .field("method", self.method())
422            .field("uri", self.uri())
423            .field("version", &self.version())
424            .field("headers", self.headers())
425            .field("body", &std::any::type_name::<T>())
426            .finish()
427    }
428}
429
430impl RequestParts {
431    fn new() -> RequestParts {
432        RequestParts {
433            method: Method::default(),
434            uri: Uri::default(),
435            version: Version::default(),
436            headers: HeaderMap::default(),
437            extensions: Extensions::default(),
438        }
439    }
440}
441
442impl std::fmt::Debug for RequestParts {
443    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
444        f.debug_struct("RequestParts")
445            .field("method", &self.method)
446            .field("uri", &self.uri)
447            .field("version", &self.version)
448            .field("headers", &self.headers)
449            .finish()
450    }
451}
452
453impl RequestBuilder {
454    /// 创建构建器的默认实例以构建请求。
455    ///
456    /// # 例子
457    ///
458    /// ```
459    /// use boluo_core::request::RequestBuilder;
460    ///
461    /// let req = RequestBuilder::new()
462    ///     .method("POST")
463    ///     .body(())
464    ///     .unwrap();
465    /// ```
466    #[inline]
467    pub fn new() -> RequestBuilder {
468        RequestBuilder::default()
469    }
470
471    /// 设置请求的 HTTP 方法。
472    ///
473    /// 默认情况下,这是 `GET`。
474    ///
475    /// # 例子
476    ///
477    /// ```
478    /// use boluo_core::request::Request;
479    ///
480    /// let req = Request::builder()
481    ///     .method("POST")
482    ///     .body(())
483    ///     .unwrap();
484    /// ```
485    pub fn method<T>(self, method: T) -> RequestBuilder
486    where
487        Method: TryFrom<T>,
488        <Method as TryFrom<T>>::Error: Into<http::Error>,
489    {
490        self.and_then(move |mut req| {
491            let method = TryFrom::try_from(method).map_err(Into::into)?;
492            req.head.method = method;
493            Ok(req)
494        })
495    }
496
497    /// 获取请求的 HTTP 方法的引用。
498    ///
499    /// 默认情况下,这是 `GET`。如果构建器有错误,则返回 [`None`]。
500    ///
501    /// # 例子
502    ///
503    /// ```
504    /// use boluo_core::http::Method;
505    /// use boluo_core::request::Request;
506    ///
507    /// let mut req = Request::builder();
508    /// assert_eq!(req.method_ref(), Some(&Method::GET));
509    ///
510    /// req = req.method("POST");
511    /// assert_eq!(req.method_ref(), Some(&Method::POST));
512    /// ```
513    pub fn method_ref(&self) -> Option<&Method> {
514        self.inner.as_ref().ok().map(|req| &req.head.method)
515    }
516
517    /// 获取请求的 HTTP 方法的可变引用。
518    ///
519    /// 默认情况下,这是 `GET`。如果构建器有错误,则返回 [`None`]。
520    ///
521    /// # 例子
522    ///
523    /// ```
524    /// use boluo_core::http::Method;
525    /// use boluo_core::request::Request;
526    ///
527    /// let mut req = Request::builder();
528    /// assert_eq!(req.method_ref(), Some(&Method::GET));
529    ///
530    /// *req.method_mut().unwrap() = Method::POST;
531    /// assert_eq!(req.method_ref(), Some(&Method::POST));
532    /// ```
533    pub fn method_mut(&mut self) -> Option<&mut Method> {
534        self.inner.as_mut().ok().map(|req| &mut req.head.method)
535    }
536
537    /// 设置请求的 URI。
538    ///
539    /// 默认情况下,这是 `/`。
540    ///
541    /// # 例子
542    ///
543    /// ```
544    /// use boluo_core::request::Request;
545    ///
546    /// let req = Request::builder()
547    ///     .uri("https://www.rust-lang.org/")
548    ///     .body(())
549    ///     .unwrap();
550    /// ```
551    pub fn uri<T>(self, uri: T) -> RequestBuilder
552    where
553        Uri: TryFrom<T>,
554        <Uri as TryFrom<T>>::Error: Into<http::Error>,
555    {
556        self.and_then(move |mut req| {
557            let uri = TryFrom::try_from(uri).map_err(Into::into)?;
558            req.head.uri = uri;
559            Ok(req)
560        })
561    }
562
563    /// 获取请求的 URI 的引用。
564    ///
565    /// 默认情况下,这是 `/`。如果构建器有错误,则返回 [`None`]。
566    ///
567    /// # 例子
568    ///
569    /// ```
570    /// use boluo_core::request::Request;
571    ///
572    /// let mut req = Request::builder();
573    /// assert_eq!(req.uri_ref().unwrap(), "/");
574    ///
575    /// req = req.uri("https://www.rust-lang.org/");
576    /// assert_eq!(req.uri_ref().unwrap(), "https://www.rust-lang.org/");
577    /// ```
578    pub fn uri_ref(&self) -> Option<&Uri> {
579        self.inner.as_ref().ok().map(|req| &req.head.uri)
580    }
581
582    /// 获取请求的 URI 的可变引用。
583    ///
584    /// 默认情况下,这是 `/`。如果构建器有错误,则返回 [`None`]。
585    ///
586    /// # 例子
587    ///
588    /// ```
589    /// use boluo_core::request::Request;
590    ///
591    /// let mut req = Request::builder();
592    /// assert_eq!(req.uri_ref().unwrap(), "/");
593    ///
594    /// *req.uri_mut().unwrap() = "https://www.rust-lang.org/".parse().unwrap();
595    /// assert_eq!(req.uri_ref().unwrap(), "https://www.rust-lang.org/");
596    /// ```
597    pub fn uri_mut(&mut self) -> Option<&mut Uri> {
598        self.inner.as_mut().ok().map(|req| &mut req.head.uri)
599    }
600
601    /// 设置请求的 HTTP 版本。
602    ///
603    /// 默认情况下,这是 `HTTP/1.1`。
604    ///
605    /// # 例子
606    ///
607    /// ```
608    /// use boluo_core::http::Version;
609    /// use boluo_core::request::Request;
610    ///
611    /// let req = Request::builder()
612    ///     .version(Version::HTTP_2)
613    ///     .body(())
614    ///     .unwrap();
615    /// ```
616    pub fn version(self, version: Version) -> RequestBuilder {
617        self.and_then(move |mut req| {
618            req.head.version = version;
619            Ok(req)
620        })
621    }
622
623    /// 获取请求的 HTTP 版本的引用。
624    ///
625    /// 默认情况下,这是 `HTTP/1.1`。如果构建器有错误,则返回 [`None`]。
626    ///
627    /// # 例子
628    ///
629    /// ```
630    /// use boluo_core::http::Version;
631    /// use boluo_core::request::Request;
632    ///
633    /// let mut req = Request::builder();
634    /// assert_eq!(req.version_ref().unwrap(), &Version::HTTP_11);
635    ///
636    /// req = req.version(Version::HTTP_2);
637    /// assert_eq!(req.version_ref().unwrap(), &Version::HTTP_2);
638    /// ```
639    pub fn version_ref(&self) -> Option<&Version> {
640        self.inner.as_ref().ok().map(|req| &req.head.version)
641    }
642
643    /// 获取请求的 HTTP 版本的可变引用。
644    ///
645    /// 默认情况下,这是 `HTTP/1.1`。如果构建器有错误,则返回 [`None`]。
646    ///
647    /// # 例子
648    ///
649    /// ```
650    /// use boluo_core::http::Version;
651    /// use boluo_core::request::Request;
652    ///
653    /// let mut req = Request::builder();
654    /// assert_eq!(req.version_ref().unwrap(), &Version::HTTP_11);
655    ///
656    /// *req.version_mut().unwrap() = Version::HTTP_2;
657    /// assert_eq!(req.version_ref().unwrap(), &Version::HTTP_2);
658    /// ```
659    pub fn version_mut(&mut self) -> Option<&mut Version> {
660        self.inner.as_mut().ok().map(|req| &mut req.head.version)
661    }
662
663    /// 将标头追加到请求中。
664    ///
665    /// 此函数将提供的键值对追加到请求内部的 [`HeaderMap`] 中。本质上,
666    /// 这相当于调用 [`HeaderMap::append`]。
667    ///
668    /// # 例子
669    ///
670    /// ```
671    /// use boluo_core::request::Request;
672    ///
673    /// let req = Request::builder()
674    ///     .header("Accept", "text/html")
675    ///     .header("X-Custom-Foo", "bar")
676    ///     .body(())
677    ///     .unwrap();
678    /// ```
679    pub fn header<K, V>(self, key: K, value: V) -> RequestBuilder
680    where
681        HeaderName: TryFrom<K>,
682        <HeaderName as TryFrom<K>>::Error: Into<http::Error>,
683        HeaderValue: TryFrom<V>,
684        <HeaderValue as TryFrom<V>>::Error: Into<http::Error>,
685    {
686        self.and_then(move |mut req| {
687            let name = <HeaderName as TryFrom<K>>::try_from(key).map_err(Into::into)?;
688            let value = <HeaderValue as TryFrom<V>>::try_from(value).map_err(Into::into)?;
689            req.head.headers.append(name, value);
690            Ok(req)
691        })
692    }
693
694    /// 获取请求的标头集的引用。
695    ///
696    /// 如果构建器有错误,则返回 [`None`]。
697    ///
698    /// # 例子
699    ///
700    /// ```
701    /// use boluo_core::request::Request;
702    ///
703    /// let req = Request::builder()
704    ///     .header("Accept", "text/html")
705    ///     .header("X-Custom-Foo", "bar");
706    ///
707    /// let headers = req.headers_ref().unwrap();
708    ///
709    /// assert_eq!(headers["Accept"], "text/html");
710    /// assert_eq!(headers["X-Custom-Foo"], "bar");
711    /// ```
712    pub fn headers_ref(&self) -> Option<&HeaderMap<HeaderValue>> {
713        self.inner.as_ref().ok().map(|req| &req.head.headers)
714    }
715
716    /// 获取请求的标头集的可变引用。
717    ///
718    /// 如果构建器有错误,则返回 [`None`]。
719    ///
720    /// # 例子
721    ///
722    /// ```
723    /// use boluo_core::http::HeaderValue;
724    /// use boluo_core::request::Request;
725    ///
726    /// let mut req = Request::builder();
727    ///
728    /// let headers = req.headers_mut().unwrap();
729    /// headers.insert("Accept", HeaderValue::from_static("text/html"));
730    /// headers.insert("X-Custom-Foo", HeaderValue::from_static("bar"));
731    ///
732    /// let headers = req.headers_ref().unwrap();
733    /// assert_eq!(headers["Accept"], "text/html");
734    /// assert_eq!(headers["X-Custom-Foo"], "bar");
735    /// ```
736    pub fn headers_mut(&mut self) -> Option<&mut HeaderMap<HeaderValue>> {
737        self.inner.as_mut().ok().map(|req| &mut req.head.headers)
738    }
739
740    /// 将一个类型添加到请求的扩展中。
741    ///
742    /// # 例子
743    ///
744    /// ```
745    /// use boluo_core::request::Request;
746    ///
747    /// let req = Request::builder()
748    ///     .extension("My Extension")
749    ///     .body(())
750    ///     .unwrap();
751    ///
752    /// assert_eq!(req.extensions().get::<&'static str>(),
753    ///            Some(&"My Extension"));
754    /// ```
755    pub fn extension<T>(self, extension: T) -> RequestBuilder
756    where
757        T: Clone + Send + Sync + 'static,
758    {
759        self.and_then(move |mut req| {
760            req.head.extensions.insert(extension);
761            Ok(req)
762        })
763    }
764
765    /// 获取请求的扩展的引用。
766    ///
767    /// 如果构建器有错误,则返回 [`None`]。
768    ///
769    /// # 例子
770    ///
771    /// ```
772    /// use boluo_core::request::Request;
773    ///
774    /// let req = Request::builder().extension("My Extension").extension(5u32);
775    /// let extensions = req.extensions_ref().unwrap();
776    ///
777    /// assert_eq!(extensions.get::<&'static str>(), Some(&"My Extension"));
778    /// assert_eq!(extensions.get::<u32>(), Some(&5u32));
779    /// ```
780    pub fn extensions_ref(&self) -> Option<&Extensions> {
781        self.inner.as_ref().ok().map(|req| &req.head.extensions)
782    }
783
784    /// 获取请求的扩展的可变引用。
785    ///
786    /// 如果构建器有错误,则返回 [`None`]。
787    ///
788    /// # 例子
789    ///
790    /// ```
791    /// use boluo_core::request::Request;
792    ///
793    /// let mut req = Request::builder().extension("My Extension");
794    /// let mut extensions = req.extensions_mut().unwrap();
795    /// assert_eq!(extensions.get::<&'static str>(), Some(&"My Extension"));
796    ///
797    /// extensions.insert(5u32);
798    /// assert_eq!(extensions.get::<u32>(), Some(&5u32));
799    /// ```
800    pub fn extensions_mut(&mut self) -> Option<&mut Extensions> {
801        self.inner.as_mut().ok().map(|req| &mut req.head.extensions)
802    }
803
804    /// 消耗构建器,使用给定的主体构建请求。
805    ///
806    /// # 错误
807    ///
808    /// 如果之前配置的任意一个参数发生错误,则在调用此函数时将返回错误。
809    ///
810    /// # 例子
811    ///
812    /// ```
813    /// use boluo_core::request::Request;
814    ///
815    /// let request = Request::builder()
816    ///     .body(())
817    ///     .unwrap();
818    /// ```
819    pub fn body<T>(self, body: T) -> Result<Request<T>> {
820        self.inner.map(move |req| req.map(|_| body))
821    }
822
823    fn and_then<F>(self, func: F) -> Self
824    where
825        F: FnOnce(Request<()>) -> Result<Request<()>>,
826    {
827        RequestBuilder {
828            inner: self.inner.and_then(func),
829        }
830    }
831}
832
833impl Default for RequestBuilder {
834    #[inline]
835    fn default() -> RequestBuilder {
836        RequestBuilder {
837            inner: Ok(Request::new(())),
838        }
839    }
840}