1 //! HTTP request types.
2 //!
3 //! This module contains structs related to HTTP requests, notably the
4 //! `Request` type itself as well as a builder to create requests. Typically
5 //! you'll import the `http::Request` type rather than reaching into this
6 //! module itself.
7 //!
8 //! # Examples
9 //!
10 //! Creating a `Request` to send
11 //!
12 //! ```no_run
13 //! use http::{Request, Response};
14 //!
15 //! let mut request = Request::builder()
16 //!     .uri("https://www.rust-lang.org/")
17 //!     .header("User-Agent", "my-awesome-agent/1.0");
18 //!
19 //! if needs_awesome_header() {
20 //!     request = request.header("Awesome", "yes");
21 //! }
22 //!
23 //! let response = send(request.body(()).unwrap());
24 //!
25 //! # fn needs_awesome_header() -> bool {
26 //! #     true
27 //! # }
28 //! #
29 //! fn send(req: Request<()>) -> Response<()> {
30 //!     // ...
31 //! # panic!()
32 //! }
33 //! ```
34 //!
35 //! Inspecting a request to see what was sent.
36 //!
37 //! ```
38 //! use http::{Request, Response, StatusCode};
39 //!
40 //! fn respond_to(req: Request<()>) -> http::Result<Response<()>> {
41 //!     if req.uri() != "/awesome-url" {
42 //!         return Response::builder()
43 //!             .status(StatusCode::NOT_FOUND)
44 //!             .body(())
45 //!     }
46 //!
47 //!     let has_awesome_header = req.headers().contains_key("Awesome");
48 //!     let body = req.body();
49 //!
50 //!     // ...
51 //! # panic!()
52 //! }
53 //! ```
54 
55 use std::any::Any;
56 use std::convert::{TryFrom};
57 use std::fmt;
58 
59 use crate::header::{HeaderMap, HeaderName, HeaderValue};
60 use crate::method::Method;
61 use crate::version::Version;
62 use crate::{Extensions, Result, Uri};
63 
64 /// Represents an HTTP request.
65 ///
66 /// An HTTP request consists of a head and a potentially optional body. The body
67 /// component is generic, enabling arbitrary types to represent the HTTP body.
68 /// For example, the body could be `Vec<u8>`, a `Stream` of byte chunks, or a
69 /// value that has been deserialized.
70 ///
71 /// # Examples
72 ///
73 /// Creating a `Request` to send
74 ///
75 /// ```no_run
76 /// use http::{Request, Response};
77 ///
78 /// let mut request = Request::builder()
79 ///     .uri("https://www.rust-lang.org/")
80 ///     .header("User-Agent", "my-awesome-agent/1.0");
81 ///
82 /// if needs_awesome_header() {
83 ///     request = request.header("Awesome", "yes");
84 /// }
85 ///
86 /// let response = send(request.body(()).unwrap());
87 ///
88 /// # fn needs_awesome_header() -> bool {
89 /// #     true
90 /// # }
91 /// #
92 /// fn send(req: Request<()>) -> Response<()> {
93 ///     // ...
94 /// # panic!()
95 /// }
96 /// ```
97 ///
98 /// Inspecting a request to see what was sent.
99 ///
100 /// ```
101 /// use http::{Request, Response, StatusCode};
102 ///
103 /// fn respond_to(req: Request<()>) -> http::Result<Response<()>> {
104 ///     if req.uri() != "/awesome-url" {
105 ///         return Response::builder()
106 ///             .status(StatusCode::NOT_FOUND)
107 ///             .body(())
108 ///     }
109 ///
110 ///     let has_awesome_header = req.headers().contains_key("Awesome");
111 ///     let body = req.body();
112 ///
113 ///     // ...
114 /// # panic!()
115 /// }
116 /// ```
117 ///
118 /// Deserialize a request of bytes via json:
119 ///
120 /// ```
121 /// # extern crate serde;
122 /// # extern crate serde_json;
123 /// # extern crate http;
124 /// use http::Request;
125 /// use serde::de;
126 ///
127 /// fn deserialize<T>(req: Request<Vec<u8>>) -> serde_json::Result<Request<T>>
128 ///     where for<'de> T: de::Deserialize<'de>,
129 /// {
130 ///     let (parts, body) = req.into_parts();
131 ///     let body = serde_json::from_slice(&body)?;
132 ///     Ok(Request::from_parts(parts, body))
133 /// }
134 /// #
135 /// # fn main() {}
136 /// ```
137 ///
138 /// Or alternatively, serialize the body of a request to json
139 ///
140 /// ```
141 /// # extern crate serde;
142 /// # extern crate serde_json;
143 /// # extern crate http;
144 /// use http::Request;
145 /// use serde::ser;
146 ///
147 /// fn serialize<T>(req: Request<T>) -> serde_json::Result<Request<Vec<u8>>>
148 ///     where T: ser::Serialize,
149 /// {
150 ///     let (parts, body) = req.into_parts();
151 ///     let body = serde_json::to_vec(&body)?;
152 ///     Ok(Request::from_parts(parts, body))
153 /// }
154 /// #
155 /// # fn main() {}
156 /// ```
157 pub struct Request<T> {
158     head: Parts,
159     body: T,
160 }
161 
162 /// Component parts of an HTTP `Request`
163 ///
164 /// The HTTP request head consists of a method, uri, version, and a set of
165 /// header fields.
166 pub struct Parts {
167     /// The request's method
168     pub method: Method,
169 
170     /// The request's URI
171     pub uri: Uri,
172 
173     /// The request's version
174     pub version: Version,
175 
176     /// The request's headers
177     pub headers: HeaderMap<HeaderValue>,
178 
179     /// The request's extensions
180     pub extensions: Extensions,
181 
182     _priv: (),
183 }
184 
185 /// An HTTP request builder
186 ///
187 /// This type can be used to construct an instance or `Request`
188 /// through a builder-like pattern.
189 #[derive(Debug)]
190 pub struct Builder {
191     inner: Result<Parts>,
192 }
193 
194 impl Request<()> {
195     /// Creates a new builder-style object to manufacture a `Request`
196     ///
197     /// This method returns an instance of `Builder` which can be used to
198     /// create a `Request`.
199     ///
200     /// # Examples
201     ///
202     /// ```
203     /// # use http::*;
204     /// let request = Request::builder()
205     ///     .method("GET")
206     ///     .uri("https://www.rust-lang.org/")
207     ///     .header("X-Custom-Foo", "Bar")
208     ///     .body(())
209     ///     .unwrap();
210     /// ```
211     #[inline]
builder() -> Builder212     pub fn builder() -> Builder {
213         Builder::new()
214     }
215 
216     /// Creates a new `Builder` initialized with a GET method and the given URI.
217     ///
218     /// This method returns an instance of `Builder` which can be used to
219     /// create a `Request`.
220     ///
221     /// # Example
222     ///
223     /// ```
224     /// # use http::*;
225     ///
226     /// let request = Request::get("https://www.rust-lang.org/")
227     ///     .body(())
228     ///     .unwrap();
229     /// ```
get<T>(uri: T) -> Builder where Uri: TryFrom<T>, <Uri as TryFrom<T>>::Error: Into<crate::Error>,230     pub fn get<T>(uri: T) -> Builder
231     where
232         Uri: TryFrom<T>,
233         <Uri as TryFrom<T>>::Error: Into<crate::Error>,
234 
235     {
236         Builder::new().method(Method::GET).uri(uri)
237     }
238 
239     /// Creates a new `Builder` initialized with a PUT method and the given URI.
240     ///
241     /// This method returns an instance of `Builder` which can be used to
242     /// create a `Request`.
243     ///
244     /// # Example
245     ///
246     /// ```
247     /// # use http::*;
248     ///
249     /// let request = Request::put("https://www.rust-lang.org/")
250     ///     .body(())
251     ///     .unwrap();
252     /// ```
put<T>(uri: T) -> Builder where Uri: TryFrom<T>, <Uri as TryFrom<T>>::Error: Into<crate::Error>,253     pub fn put<T>(uri: T) -> Builder
254     where
255         Uri: TryFrom<T>,
256         <Uri as TryFrom<T>>::Error: Into<crate::Error>,
257 
258     {
259         Builder::new().method(Method::PUT).uri(uri)
260     }
261 
262     /// Creates a new `Builder` initialized with a POST method and the given URI.
263     ///
264     /// This method returns an instance of `Builder` which can be used to
265     /// create a `Request`.
266     ///
267     /// # Example
268     ///
269     /// ```
270     /// # use http::*;
271     ///
272     /// let request = Request::post("https://www.rust-lang.org/")
273     ///     .body(())
274     ///     .unwrap();
275     /// ```
post<T>(uri: T) -> Builder where Uri: TryFrom<T>, <Uri as TryFrom<T>>::Error: Into<crate::Error>,276     pub fn post<T>(uri: T) -> Builder
277     where
278         Uri: TryFrom<T>,
279         <Uri as TryFrom<T>>::Error: Into<crate::Error>,
280 
281     {
282         Builder::new().method(Method::POST).uri(uri)
283     }
284 
285     /// Creates a new `Builder` initialized with a DELETE method and the given URI.
286     ///
287     /// This method returns an instance of `Builder` which can be used to
288     /// create a `Request`.
289     ///
290     /// # Example
291     ///
292     /// ```
293     /// # use http::*;
294     ///
295     /// let request = Request::delete("https://www.rust-lang.org/")
296     ///     .body(())
297     ///     .unwrap();
298     /// ```
delete<T>(uri: T) -> Builder where Uri: TryFrom<T>, <Uri as TryFrom<T>>::Error: Into<crate::Error>,299     pub fn delete<T>(uri: T) -> Builder
300     where
301         Uri: TryFrom<T>,
302         <Uri as TryFrom<T>>::Error: Into<crate::Error>,
303 
304     {
305         Builder::new().method(Method::DELETE).uri(uri)
306     }
307 
308     /// Creates a new `Builder` initialized with an OPTIONS method and the given URI.
309     ///
310     /// This method returns an instance of `Builder` which can be used to
311     /// create a `Request`.
312     ///
313     /// # Example
314     ///
315     /// ```
316     /// # use http::*;
317     ///
318     /// let request = Request::options("https://www.rust-lang.org/")
319     ///     .body(())
320     ///     .unwrap();
321     /// # assert_eq!(*request.method(), Method::OPTIONS);
322     /// ```
options<T>(uri: T) -> Builder where Uri: TryFrom<T>, <Uri as TryFrom<T>>::Error: Into<crate::Error>,323     pub fn options<T>(uri: T) -> Builder
324     where
325         Uri: TryFrom<T>,
326         <Uri as TryFrom<T>>::Error: Into<crate::Error>,
327 
328     {
329         Builder::new().method(Method::OPTIONS).uri(uri)
330     }
331 
332     /// Creates a new `Builder` initialized with a HEAD method and the given URI.
333     ///
334     /// This method returns an instance of `Builder` which can be used to
335     /// create a `Request`.
336     ///
337     /// # Example
338     ///
339     /// ```
340     /// # use http::*;
341     ///
342     /// let request = Request::head("https://www.rust-lang.org/")
343     ///     .body(())
344     ///     .unwrap();
345     /// ```
head<T>(uri: T) -> Builder where Uri: TryFrom<T>, <Uri as TryFrom<T>>::Error: Into<crate::Error>,346     pub fn head<T>(uri: T) -> Builder
347     where
348         Uri: TryFrom<T>,
349         <Uri as TryFrom<T>>::Error: Into<crate::Error>,
350 
351     {
352         Builder::new().method(Method::HEAD).uri(uri)
353     }
354 
355     /// Creates a new `Builder` initialized with a CONNECT method and the given URI.
356     ///
357     /// This method returns an instance of `Builder` which can be used to
358     /// create a `Request`.
359     ///
360     /// # Example
361     ///
362     /// ```
363     /// # use http::*;
364     ///
365     /// let request = Request::connect("https://www.rust-lang.org/")
366     ///     .body(())
367     ///     .unwrap();
368     /// ```
connect<T>(uri: T) -> Builder where Uri: TryFrom<T>, <Uri as TryFrom<T>>::Error: Into<crate::Error>,369     pub fn connect<T>(uri: T) -> Builder
370     where
371         Uri: TryFrom<T>,
372         <Uri as TryFrom<T>>::Error: Into<crate::Error>,
373 
374     {
375         Builder::new().method(Method::CONNECT).uri(uri)
376     }
377 
378     /// Creates a new `Builder` initialized with a PATCH method and the given URI.
379     ///
380     /// This method returns an instance of `Builder` which can be used to
381     /// create a `Request`.
382     ///
383     /// # Example
384     ///
385     /// ```
386     /// # use http::*;
387     ///
388     /// let request = Request::patch("https://www.rust-lang.org/")
389     ///     .body(())
390     ///     .unwrap();
391     /// ```
patch<T>(uri: T) -> Builder where Uri: TryFrom<T>, <Uri as TryFrom<T>>::Error: Into<crate::Error>,392     pub fn patch<T>(uri: T) -> Builder
393     where
394         Uri: TryFrom<T>,
395         <Uri as TryFrom<T>>::Error: Into<crate::Error>,
396     {
397         Builder::new().method(Method::PATCH).uri(uri)
398     }
399 
400     /// Creates a new `Builder` initialized with a TRACE method and the given URI.
401     ///
402     /// This method returns an instance of `Builder` which can be used to
403     /// create a `Request`.
404     ///
405     /// # Example
406     ///
407     /// ```
408     /// # use http::*;
409     ///
410     /// let request = Request::trace("https://www.rust-lang.org/")
411     ///     .body(())
412     ///     .unwrap();
413     /// ```
trace<T>(uri: T) -> Builder where Uri: TryFrom<T>, <Uri as TryFrom<T>>::Error: Into<crate::Error>,414     pub fn trace<T>(uri: T) -> Builder
415     where
416         Uri: TryFrom<T>,
417         <Uri as TryFrom<T>>::Error: Into<crate::Error>,
418     {
419         Builder::new().method(Method::TRACE).uri(uri)
420     }
421 }
422 
423 impl<T> Request<T> {
424     /// Creates a new blank `Request` with the body
425     ///
426     /// The component parts of this request will be set to their default, e.g.
427     /// the GET method, no headers, etc.
428     ///
429     /// # Examples
430     ///
431     /// ```
432     /// # use http::*;
433     /// let request = Request::new("hello world");
434     ///
435     /// assert_eq!(*request.method(), Method::GET);
436     /// assert_eq!(*request.body(), "hello world");
437     /// ```
438     #[inline]
new(body: T) -> Request<T>439     pub fn new(body: T) -> Request<T> {
440         Request {
441             head: Parts::new(),
442             body: body,
443         }
444     }
445 
446     /// Creates a new `Request` with the given components parts and body.
447     ///
448     /// # Examples
449     ///
450     /// ```
451     /// # use http::*;
452     /// let request = Request::new("hello world");
453     /// let (mut parts, body) = request.into_parts();
454     /// parts.method = Method::POST;
455     ///
456     /// let request = Request::from_parts(parts, body);
457     /// ```
458     #[inline]
from_parts(parts: Parts, body: T) -> Request<T>459     pub fn from_parts(parts: Parts, body: T) -> Request<T> {
460         Request {
461             head: parts,
462             body: body,
463         }
464     }
465 
466     /// Returns a reference to the associated HTTP method.
467     ///
468     /// # Examples
469     ///
470     /// ```
471     /// # use http::*;
472     /// let request: Request<()> = Request::default();
473     /// assert_eq!(*request.method(), Method::GET);
474     /// ```
475     #[inline]
method(&self) -> &Method476     pub fn method(&self) -> &Method {
477         &self.head.method
478     }
479 
480     /// Returns a mutable reference to the associated HTTP method.
481     ///
482     /// # Examples
483     ///
484     /// ```
485     /// # use http::*;
486     /// let mut request: Request<()> = Request::default();
487     /// *request.method_mut() = Method::PUT;
488     /// assert_eq!(*request.method(), Method::PUT);
489     /// ```
490     #[inline]
method_mut(&mut self) -> &mut Method491     pub fn method_mut(&mut self) -> &mut Method {
492         &mut self.head.method
493     }
494 
495     /// Returns a reference to the associated URI.
496     ///
497     /// # Examples
498     ///
499     /// ```
500     /// # use http::*;
501     /// let request: Request<()> = Request::default();
502     /// assert_eq!(*request.uri(), *"/");
503     /// ```
504     #[inline]
uri(&self) -> &Uri505     pub fn uri(&self) -> &Uri {
506         &self.head.uri
507     }
508 
509     /// Returns a mutable reference to the associated URI.
510     ///
511     /// # Examples
512     ///
513     /// ```
514     /// # use http::*;
515     /// let mut request: Request<()> = Request::default();
516     /// *request.uri_mut() = "/hello".parse().unwrap();
517     /// assert_eq!(*request.uri(), *"/hello");
518     /// ```
519     #[inline]
uri_mut(&mut self) -> &mut Uri520     pub fn uri_mut(&mut self) -> &mut Uri {
521         &mut self.head.uri
522     }
523 
524     /// Returns the associated version.
525     ///
526     /// # Examples
527     ///
528     /// ```
529     /// # use http::*;
530     /// let request: Request<()> = Request::default();
531     /// assert_eq!(request.version(), Version::HTTP_11);
532     /// ```
533     #[inline]
version(&self) -> Version534     pub fn version(&self) -> Version {
535         self.head.version
536     }
537 
538     /// Returns a mutable reference to the associated version.
539     ///
540     /// # Examples
541     ///
542     /// ```
543     /// # use http::*;
544     /// let mut request: Request<()> = Request::default();
545     /// *request.version_mut() = Version::HTTP_2;
546     /// assert_eq!(request.version(), Version::HTTP_2);
547     /// ```
548     #[inline]
version_mut(&mut self) -> &mut Version549     pub fn version_mut(&mut self) -> &mut Version {
550         &mut self.head.version
551     }
552 
553     /// Returns a reference to the associated header field map.
554     ///
555     /// # Examples
556     ///
557     /// ```
558     /// # use http::*;
559     /// let request: Request<()> = Request::default();
560     /// assert!(request.headers().is_empty());
561     /// ```
562     #[inline]
headers(&self) -> &HeaderMap<HeaderValue>563     pub fn headers(&self) -> &HeaderMap<HeaderValue> {
564         &self.head.headers
565     }
566 
567     /// Returns a mutable reference to the associated header field map.
568     ///
569     /// # Examples
570     ///
571     /// ```
572     /// # use http::*;
573     /// # use http::header::*;
574     /// let mut request: Request<()> = Request::default();
575     /// request.headers_mut().insert(HOST, HeaderValue::from_static("world"));
576     /// assert!(!request.headers().is_empty());
577     /// ```
578     #[inline]
headers_mut(&mut self) -> &mut HeaderMap<HeaderValue>579     pub fn headers_mut(&mut self) -> &mut HeaderMap<HeaderValue> {
580         &mut self.head.headers
581     }
582 
583     /// Returns a reference to the associated extensions.
584     ///
585     /// # Examples
586     ///
587     /// ```
588     /// # use http::*;
589     /// let request: Request<()> = Request::default();
590     /// assert!(request.extensions().get::<i32>().is_none());
591     /// ```
592     #[inline]
extensions(&self) -> &Extensions593     pub fn extensions(&self) -> &Extensions {
594         &self.head.extensions
595     }
596 
597     /// Returns a mutable reference to the associated extensions.
598     ///
599     /// # Examples
600     ///
601     /// ```
602     /// # use http::*;
603     /// # use http::header::*;
604     /// let mut request: Request<()> = Request::default();
605     /// request.extensions_mut().insert("hello");
606     /// assert_eq!(request.extensions().get(), Some(&"hello"));
607     /// ```
608     #[inline]
extensions_mut(&mut self) -> &mut Extensions609     pub fn extensions_mut(&mut self) -> &mut Extensions {
610         &mut self.head.extensions
611     }
612 
613     /// Returns a reference to the associated HTTP body.
614     ///
615     /// # Examples
616     ///
617     /// ```
618     /// # use http::*;
619     /// let request: Request<String> = Request::default();
620     /// assert!(request.body().is_empty());
621     /// ```
622     #[inline]
body(&self) -> &T623     pub fn body(&self) -> &T {
624         &self.body
625     }
626 
627     /// Returns a mutable reference to the associated HTTP body.
628     ///
629     /// # Examples
630     ///
631     /// ```
632     /// # use http::*;
633     /// let mut request: Request<String> = Request::default();
634     /// request.body_mut().push_str("hello world");
635     /// assert!(!request.body().is_empty());
636     /// ```
637     #[inline]
body_mut(&mut self) -> &mut T638     pub fn body_mut(&mut self) -> &mut T {
639         &mut self.body
640     }
641 
642     /// Consumes the request, returning just the body.
643     ///
644     /// # Examples
645     ///
646     /// ```
647     /// # use http::Request;
648     /// let request = Request::new(10);
649     /// let body = request.into_body();
650     /// assert_eq!(body, 10);
651     /// ```
652     #[inline]
into_body(self) -> T653     pub fn into_body(self) -> T {
654         self.body
655     }
656 
657     /// Consumes the request returning the head and body parts.
658     ///
659     /// # Examples
660     ///
661     /// ```
662     /// # use http::*;
663     /// let request = Request::new(());
664     /// let (parts, body) = request.into_parts();
665     /// assert_eq!(parts.method, Method::GET);
666     /// ```
667     #[inline]
into_parts(self) -> (Parts, T)668     pub fn into_parts(self) -> (Parts, T) {
669         (self.head, self.body)
670     }
671 
672     /// Consumes the request returning a new request with body mapped to the
673     /// return type of the passed in function.
674     ///
675     /// # Examples
676     ///
677     /// ```
678     /// # use http::*;
679     /// let request = Request::builder().body("some string").unwrap();
680     /// let mapped_request: Request<&[u8]> = request.map(|b| {
681     ///   assert_eq!(b, "some string");
682     ///   b.as_bytes()
683     /// });
684     /// assert_eq!(mapped_request.body(), &"some string".as_bytes());
685     /// ```
686     #[inline]
map<F, U>(self, f: F) -> Request<U> where F: FnOnce(T) -> U,687     pub fn map<F, U>(self, f: F) -> Request<U>
688     where
689         F: FnOnce(T) -> U,
690     {
691         Request {
692             body: f(self.body),
693             head: self.head,
694         }
695     }
696 }
697 
698 impl<T: Default> Default for Request<T> {
default() -> Request<T>699     fn default() -> Request<T> {
700         Request::new(T::default())
701     }
702 }
703 
704 impl<T: fmt::Debug> fmt::Debug for Request<T> {
fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result705     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
706         f.debug_struct("Request")
707             .field("method", self.method())
708             .field("uri", self.uri())
709             .field("version", &self.version())
710             .field("headers", self.headers())
711             // omits Extensions because not useful
712             .field("body", self.body())
713             .finish()
714     }
715 }
716 
717 impl Parts {
718     /// Creates a new default instance of `Parts`
new() -> Parts719     fn new() -> Parts {
720         Parts {
721             method: Method::default(),
722             uri: Uri::default(),
723             version: Version::default(),
724             headers: HeaderMap::default(),
725             extensions: Extensions::default(),
726             _priv: (),
727         }
728     }
729 }
730 
731 impl fmt::Debug for Parts {
fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result732     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
733         f.debug_struct("Parts")
734             .field("method", &self.method)
735             .field("uri", &self.uri)
736             .field("version", &self.version)
737             .field("headers", &self.headers)
738             // omits Extensions because not useful
739             // omits _priv because not useful
740             .finish()
741     }
742 }
743 
744 impl Builder {
745     /// Creates a new default instance of `Builder` to construct a `Request`.
746     ///
747     /// # Examples
748     ///
749     /// ```
750     /// # use http::*;
751     ///
752     /// let req = request::Builder::new()
753     ///     .method("POST")
754     ///     .body(())
755     ///     .unwrap();
756     /// ```
757     #[inline]
new() -> Builder758     pub fn new() -> Builder {
759         Builder::default()
760     }
761 
762     /// Set the HTTP method for this request.
763     ///
764     /// This function will configure the HTTP method of the `Request` that will
765     /// be returned from `Builder::build`.
766     ///
767     /// By default this is `GET`.
768     ///
769     /// # Examples
770     ///
771     /// ```
772     /// # use http::*;
773     ///
774     /// let req = Request::builder()
775     ///     .method("POST")
776     ///     .body(())
777     ///     .unwrap();
778     /// ```
method<T>(self, method: T) -> Builder where Method: TryFrom<T>, <Method as TryFrom<T>>::Error: Into<crate::Error>,779     pub fn method<T>(self, method: T) -> Builder
780     where
781         Method: TryFrom<T>,
782         <Method as TryFrom<T>>::Error: Into<crate::Error>,
783     {
784         self.and_then(move |mut head| {
785             let method = TryFrom::try_from(method).map_err(Into::into)?;
786             head.method = method;
787             Ok(head)
788         })
789     }
790 
791     /// Get the HTTP Method for this request.
792     ///
793     /// By default this is `GET`. If builder has error, returns None.
794     ///
795     /// # Examples
796     ///
797     /// ```
798     /// # use http::*;
799     ///
800     /// let mut req = Request::builder();
801     /// assert_eq!(req.method_ref(),Some(&Method::GET));
802     ///
803     /// req = req.method("POST");
804     /// assert_eq!(req.method_ref(),Some(&Method::POST));
805     /// ```
method_ref(&self) -> Option<&Method>806     pub fn method_ref(&self) -> Option<&Method> {
807         self.inner.as_ref().ok().map(|h| &h.method)
808     }
809 
810     /// Set the URI for this request.
811     ///
812     /// This function will configure the URI of the `Request` that will
813     /// be returned from `Builder::build`.
814     ///
815     /// By default this is `/`.
816     ///
817     /// # Examples
818     ///
819     /// ```
820     /// # use http::*;
821     ///
822     /// let req = Request::builder()
823     ///     .uri("https://www.rust-lang.org/")
824     ///     .body(())
825     ///     .unwrap();
826     /// ```
uri<T>(self, uri: T) -> Builder where Uri: TryFrom<T>, <Uri as TryFrom<T>>::Error: Into<crate::Error>,827     pub fn uri<T>(self, uri: T) -> Builder
828     where
829         Uri: TryFrom<T>,
830         <Uri as TryFrom<T>>::Error: Into<crate::Error>,
831     {
832         self.and_then(move |mut head| {
833             head.uri = TryFrom::try_from(uri).map_err(Into::into)?;
834             Ok(head)
835         })
836     }
837 
838     /// Get the URI for this request
839     ///
840     /// By default this is `/`.
841     ///
842     /// # Examples
843     ///
844     /// ```
845     /// # use http::*;
846     ///
847     /// let mut req = Request::builder();
848     /// assert_eq!(req.uri_ref().unwrap(), "/" );
849     ///
850     /// req = req.uri("https://www.rust-lang.org/");
851     /// assert_eq!(req.uri_ref().unwrap(), "https://www.rust-lang.org/" );
852     /// ```
uri_ref(&self) -> Option<&Uri>853     pub fn uri_ref(&self) -> Option<&Uri> {
854         self.inner.as_ref().ok().map(|h| &h.uri)
855     }
856 
857     /// Set the HTTP version for this request.
858     ///
859     /// This function will configure the HTTP version of the `Request` that
860     /// will be returned from `Builder::build`.
861     ///
862     /// By default this is HTTP/1.1
863     ///
864     /// # Examples
865     ///
866     /// ```
867     /// # use http::*;
868     ///
869     /// let req = Request::builder()
870     ///     .version(Version::HTTP_2)
871     ///     .body(())
872     ///     .unwrap();
873     /// ```
version(self, version: Version) -> Builder874     pub fn version(self, version: Version) -> Builder {
875         self.and_then(move |mut head| {
876             head.version = version;
877             Ok(head)
878         })
879     }
880 
881     /// Get the HTTP version for this request
882     ///
883     /// By default this is HTTP/1.1.
884     ///
885     /// # Examples
886     ///
887     /// ```
888     /// # use http::*;
889     ///
890     /// let mut req = Request::builder();
891     /// assert_eq!(req.version_ref().unwrap(), &Version::HTTP_11 );
892     ///
893     /// req = req.version(Version::HTTP_2);
894     /// assert_eq!(req.version_ref().unwrap(), &Version::HTTP_2 );
895     /// ```
version_ref(&self) -> Option<&Version>896     pub fn version_ref(&self) -> Option<&Version> {
897         self.inner.as_ref().ok().map(|h| &h.version)
898     }
899 
900     /// Appends a header to this request builder.
901     ///
902     /// This function will append the provided key/value as a header to the
903     /// internal `HeaderMap` being constructed. Essentially this is equivalent
904     /// to calling `HeaderMap::append`.
905     ///
906     /// # Examples
907     ///
908     /// ```
909     /// # use http::*;
910     /// # use http::header::HeaderValue;
911     ///
912     /// let req = Request::builder()
913     ///     .header("Accept", "text/html")
914     ///     .header("X-Custom-Foo", "bar")
915     ///     .body(())
916     ///     .unwrap();
917     /// ```
header<K, V>(self, key: K, value: V) -> Builder where HeaderName: TryFrom<K>, <HeaderName as TryFrom<K>>::Error: Into<crate::Error>, HeaderValue: TryFrom<V>, <HeaderValue as TryFrom<V>>::Error: Into<crate::Error>,918     pub fn header<K, V>(self, key: K, value: V) -> Builder
919     where
920         HeaderName: TryFrom<K>,
921         <HeaderName as TryFrom<K>>::Error: Into<crate::Error>,
922         HeaderValue: TryFrom<V>,
923         <HeaderValue as TryFrom<V>>::Error: Into<crate::Error>,
924     {
925         self.and_then(move |mut head| {
926             let name = <HeaderName as TryFrom<K>>::try_from(key).map_err(Into::into)?;
927             let value = <HeaderValue as TryFrom<V>>::try_from(value).map_err(Into::into)?;
928             head.headers.append(name, value);
929             Ok(head)
930         })
931     }
932 
933     /// Get header on this request builder.
934     /// when builder has error returns None
935     ///
936     /// # Example
937     ///
938     /// ```
939     /// # use http::Request;
940     /// let req = Request::builder()
941     ///     .header("Accept", "text/html")
942     ///     .header("X-Custom-Foo", "bar");
943     /// let headers = req.headers_ref().unwrap();
944     /// assert_eq!( headers["Accept"], "text/html" );
945     /// assert_eq!( headers["X-Custom-Foo"], "bar" );
946     /// ```
headers_ref(&self) -> Option<&HeaderMap<HeaderValue>>947     pub fn headers_ref(&self) -> Option<&HeaderMap<HeaderValue>> {
948         self.inner.as_ref().ok().map(|h| &h.headers)
949     }
950 
951     /// Get headers on this request builder.
952     ///
953     /// When builder has error returns None.
954     ///
955     /// # Example
956     ///
957     /// ```
958     /// # use http::{header::HeaderValue, Request};
959     /// let mut req = Request::builder();
960     /// {
961     ///   let headers = req.headers_mut().unwrap();
962     ///   headers.insert("Accept", HeaderValue::from_static("text/html"));
963     ///   headers.insert("X-Custom-Foo", HeaderValue::from_static("bar"));
964     /// }
965     /// let headers = req.headers_ref().unwrap();
966     /// assert_eq!( headers["Accept"], "text/html" );
967     /// assert_eq!( headers["X-Custom-Foo"], "bar" );
968     /// ```
headers_mut(&mut self) -> Option<&mut HeaderMap<HeaderValue>>969     pub fn headers_mut(&mut self) -> Option<&mut HeaderMap<HeaderValue>> {
970         self.inner.as_mut().ok().map(|h| &mut h.headers)
971     }
972 
973     /// Adds an extension to this builder
974     ///
975     /// # Examples
976     ///
977     /// ```
978     /// # use http::*;
979     ///
980     /// let req = Request::builder()
981     ///     .extension("My Extension")
982     ///     .body(())
983     ///     .unwrap();
984     ///
985     /// assert_eq!(req.extensions().get::<&'static str>(),
986     ///            Some(&"My Extension"));
987     /// ```
extension<T>(self, extension: T) -> Builder where T: Any + Send + Sync + 'static,988     pub fn extension<T>(self, extension: T) -> Builder
989     where
990         T: Any + Send + Sync + 'static,
991     {
992         self.and_then(move |mut head| {
993             head.extensions.insert(extension);
994             Ok(head)
995         })
996     }
997 
998     /// Get a reference to the extensions for this request builder.
999     ///
1000     /// If the builder has an error, this returns `None`.
1001     ///
1002     /// # Example
1003     ///
1004     /// ```
1005     /// # use http::Request;
1006     /// let req = Request::builder().extension("My Extension").extension(5u32);
1007     /// let extensions = req.extensions_ref().unwrap();
1008     /// assert_eq!(extensions.get::<&'static str>(), Some(&"My Extension"));
1009     /// assert_eq!(extensions.get::<u32>(), Some(&5u32));
1010     /// ```
extensions_ref(&self) -> Option<&Extensions>1011     pub fn extensions_ref(&self) -> Option<&Extensions> {
1012         self.inner.as_ref().ok().map(|h| &h.extensions)
1013     }
1014 
1015     /// Get a mutable reference to the extensions for this request builder.
1016     ///
1017     /// If the builder has an error, this returns `None`.
1018     ///
1019     /// # Example
1020     ///
1021     /// ```
1022     /// # use http::Request;
1023     /// let mut req = Request::builder().extension("My Extension");
1024     /// let mut extensions = req.extensions_mut().unwrap();
1025     /// assert_eq!(extensions.get::<&'static str>(), Some(&"My Extension"));
1026     /// extensions.insert(5u32);
1027     /// assert_eq!(extensions.get::<u32>(), Some(&5u32));
1028     /// ```
extensions_mut(&mut self) -> Option<&mut Extensions>1029     pub fn extensions_mut(&mut self) -> Option<&mut Extensions> {
1030         self.inner.as_mut().ok().map(|h| &mut h.extensions)
1031     }
1032 
1033     /// "Consumes" this builder, using the provided `body` to return a
1034     /// constructed `Request`.
1035     ///
1036     /// # Errors
1037     ///
1038     /// This function may return an error if any previously configured argument
1039     /// failed to parse or get converted to the internal representation. For
1040     /// example if an invalid `head` was specified via `header("Foo",
1041     /// "Bar\r\n")` the error will be returned when this function is called
1042     /// rather than when `header` was called.
1043     ///
1044     /// # Examples
1045     ///
1046     /// ```
1047     /// # use http::*;
1048     ///
1049     /// let request = Request::builder()
1050     ///     .body(())
1051     ///     .unwrap();
1052     /// ```
body<T>(self, body: T) -> Result<Request<T>>1053     pub fn body<T>(self, body: T) -> Result<Request<T>> {
1054         self.inner.map(move |head| {
1055             Request {
1056                 head,
1057                 body,
1058             }
1059         })
1060     }
1061 
1062     // private
1063 
and_then<F>(self, func: F) -> Self where F: FnOnce(Parts) -> Result<Parts>1064     fn and_then<F>(self, func: F) -> Self
1065     where
1066         F: FnOnce(Parts) -> Result<Parts>
1067     {
1068         Builder {
1069             inner: self.inner.and_then(func),
1070         }
1071     }
1072 }
1073 
1074 impl Default for Builder {
1075     #[inline]
default() -> Builder1076     fn default() -> Builder {
1077         Builder {
1078             inner: Ok(Parts::new()),
1079         }
1080     }
1081 }
1082 
1083 #[cfg(test)]
1084 mod tests {
1085     use super::*;
1086 
1087     #[test]
it_can_map_a_body_from_one_type_to_another()1088     fn it_can_map_a_body_from_one_type_to_another() {
1089         let request = Request::builder().body("some string").unwrap();
1090         let mapped_request = request.map(|s| {
1091             assert_eq!(s, "some string");
1092             123u32
1093         });
1094         assert_eq!(mapped_request.body(), &123u32);
1095     }
1096 }
1097