1 //! HTTP response types.
2 //!
3 //! This module contains structs related to HTTP responses, notably the
4 //! `Response` type itself as well as a builder to create responses. Typically
5 //! you'll import the `http::Response` type rather than reaching into this
6 //! module itself.
7 //!
8 //! # Examples
9 //!
10 //! Creating a `Response` to return
11 //!
12 //! ```
13 //! use http::{Request, Response, StatusCode};
14 //!
15 //! fn respond_to(req: Request<()>) -> http::Result<Response<()>> {
16 //!     let mut builder = Response::builder()
17 //!         .header("Foo", "Bar")
18 //!         .status(StatusCode::OK);
19 //!
20 //!     if req.headers().contains_key("Another-Header") {
21 //!         builder = builder.header("Another-Header", "Ack");
22 //!     }
23 //!
24 //!     builder.body(())
25 //! }
26 //! ```
27 //!
28 //! A simple 404 handler
29 //!
30 //! ```
31 //! use http::{Request, Response, StatusCode};
32 //!
33 //! fn not_found(_req: Request<()>) -> http::Result<Response<()>> {
34 //!     Response::builder()
35 //!         .status(StatusCode::NOT_FOUND)
36 //!         .body(())
37 //! }
38 //! ```
39 //!
40 //! Or otherwise inspecting the result of a request:
41 //!
42 //! ```no_run
43 //! use http::{Request, Response};
44 //!
45 //! fn get(url: &str) -> http::Result<Response<()>> {
46 //!     // ...
47 //! # panic!()
48 //! }
49 //!
50 //! let response = get("https://www.rust-lang.org/").unwrap();
51 //!
52 //! if !response.status().is_success() {
53 //!     panic!("failed to get a successful response status!");
54 //! }
55 //!
56 //! if let Some(date) = response.headers().get("Date") {
57 //!     // we've got a `Date` header!
58 //! }
59 //!
60 //! let body = response.body();
61 //! // ...
62 //! ```
63 
64 use std::any::Any;
65 use std::convert::TryFrom;
66 use std::fmt;
67 
68 use crate::header::{HeaderMap, HeaderName, HeaderValue};
69 use crate::status::StatusCode;
70 use crate::version::Version;
71 use crate::{Extensions, Result};
72 
73 /// Represents an HTTP response
74 ///
75 /// An HTTP response consists of a head and a potentially optional body. The body
76 /// component is generic, enabling arbitrary types to represent the HTTP body.
77 /// For example, the body could be `Vec<u8>`, a `Stream` of byte chunks, or a
78 /// value that has been deserialized.
79 ///
80 /// Typically you'll work with responses on the client side as the result of
81 /// sending a `Request` and on the server you'll be generating a `Response` to
82 /// send back to the client.
83 ///
84 /// # Examples
85 ///
86 /// Creating a `Response` to return
87 ///
88 /// ```
89 /// use http::{Request, Response, StatusCode};
90 ///
91 /// fn respond_to(req: Request<()>) -> http::Result<Response<()>> {
92 ///     let mut builder = Response::builder()
93 ///         .header("Foo", "Bar")
94 ///         .status(StatusCode::OK);
95 ///
96 ///     if req.headers().contains_key("Another-Header") {
97 ///         builder = builder.header("Another-Header", "Ack");
98 ///     }
99 ///
100 ///     builder.body(())
101 /// }
102 /// ```
103 ///
104 /// A simple 404 handler
105 ///
106 /// ```
107 /// use http::{Request, Response, StatusCode};
108 ///
109 /// fn not_found(_req: Request<()>) -> http::Result<Response<()>> {
110 ///     Response::builder()
111 ///         .status(StatusCode::NOT_FOUND)
112 ///         .body(())
113 /// }
114 /// ```
115 ///
116 /// Or otherwise inspecting the result of a request:
117 ///
118 /// ```no_run
119 /// use http::{Request, Response};
120 ///
121 /// fn get(url: &str) -> http::Result<Response<()>> {
122 ///     // ...
123 /// # panic!()
124 /// }
125 ///
126 /// let response = get("https://www.rust-lang.org/").unwrap();
127 ///
128 /// if !response.status().is_success() {
129 ///     panic!("failed to get a successful response status!");
130 /// }
131 ///
132 /// if let Some(date) = response.headers().get("Date") {
133 ///     // we've got a `Date` header!
134 /// }
135 ///
136 /// let body = response.body();
137 /// // ...
138 /// ```
139 ///
140 /// Deserialize a response of bytes via json:
141 ///
142 /// ```
143 /// # extern crate serde;
144 /// # extern crate serde_json;
145 /// # extern crate http;
146 /// use http::Response;
147 /// use serde::de;
148 ///
149 /// fn deserialize<T>(res: Response<Vec<u8>>) -> serde_json::Result<Response<T>>
150 ///     where for<'de> T: de::Deserialize<'de>,
151 /// {
152 ///     let (parts, body) = res.into_parts();
153 ///     let body = serde_json::from_slice(&body)?;
154 ///     Ok(Response::from_parts(parts, body))
155 /// }
156 /// #
157 /// # fn main() {}
158 /// ```
159 ///
160 /// Or alternatively, serialize the body of a response to json
161 ///
162 /// ```
163 /// # extern crate serde;
164 /// # extern crate serde_json;
165 /// # extern crate http;
166 /// use http::Response;
167 /// use serde::ser;
168 ///
169 /// fn serialize<T>(res: Response<T>) -> serde_json::Result<Response<Vec<u8>>>
170 ///     where T: ser::Serialize,
171 /// {
172 ///     let (parts, body) = res.into_parts();
173 ///     let body = serde_json::to_vec(&body)?;
174 ///     Ok(Response::from_parts(parts, body))
175 /// }
176 /// #
177 /// # fn main() {}
178 /// ```
179 pub struct Response<T> {
180     head: Parts,
181     body: T,
182 }
183 
184 /// Component parts of an HTTP `Response`
185 ///
186 /// The HTTP response head consists of a status, version, and a set of
187 /// header fields.
188 pub struct Parts {
189     /// The response's status
190     pub status: StatusCode,
191 
192     /// The response's version
193     pub version: Version,
194 
195     /// The response's headers
196     pub headers: HeaderMap<HeaderValue>,
197 
198     /// The response's extensions
199     pub extensions: Extensions,
200 
201     _priv: (),
202 }
203 
204 /// An HTTP response builder
205 ///
206 /// This type can be used to construct an instance of `Response` through a
207 /// builder-like pattern.
208 #[derive(Debug)]
209 pub struct Builder {
210     inner: Result<Parts>,
211 }
212 
213 impl Response<()> {
214     /// Creates a new builder-style object to manufacture a `Response`
215     ///
216     /// This method returns an instance of `Builder` which can be used to
217     /// create a `Response`.
218     ///
219     /// # Examples
220     ///
221     /// ```
222     /// # use http::*;
223     /// let response = Response::builder()
224     ///     .status(200)
225     ///     .header("X-Custom-Foo", "Bar")
226     ///     .body(())
227     ///     .unwrap();
228     /// ```
229     #[inline]
builder() -> Builder230     pub fn builder() -> Builder {
231         Builder::new()
232     }
233 }
234 
235 impl<T> Response<T> {
236     /// Creates a new blank `Response` with the body
237     ///
238     /// The component ports of this response will be set to their default, e.g.
239     /// the ok status, no headers, etc.
240     ///
241     /// # Examples
242     ///
243     /// ```
244     /// # use http::*;
245     /// let response = Response::new("hello world");
246     ///
247     /// assert_eq!(response.status(), StatusCode::OK);
248     /// assert_eq!(*response.body(), "hello world");
249     /// ```
250     #[inline]
new(body: T) -> Response<T>251     pub fn new(body: T) -> Response<T> {
252         Response {
253             head: Parts::new(),
254             body: body,
255         }
256     }
257 
258     /// Creates a new `Response` with the given head and body
259     ///
260     /// # Examples
261     ///
262     /// ```
263     /// # use http::*;
264     /// let response = Response::new("hello world");
265     /// let (mut parts, body) = response.into_parts();
266     ///
267     /// parts.status = StatusCode::BAD_REQUEST;
268     /// let response = Response::from_parts(parts, body);
269     ///
270     /// assert_eq!(response.status(), StatusCode::BAD_REQUEST);
271     /// assert_eq!(*response.body(), "hello world");
272     /// ```
273     #[inline]
from_parts(parts: Parts, body: T) -> Response<T>274     pub fn from_parts(parts: Parts, body: T) -> Response<T> {
275         Response {
276             head: parts,
277             body: body,
278         }
279     }
280 
281     /// Returns the `StatusCode`.
282     ///
283     /// # Examples
284     ///
285     /// ```
286     /// # use http::*;
287     /// let response: Response<()> = Response::default();
288     /// assert_eq!(response.status(), StatusCode::OK);
289     /// ```
290     #[inline]
status(&self) -> StatusCode291     pub fn status(&self) -> StatusCode {
292         self.head.status
293     }
294 
295     /// Returns a mutable reference to the associated `StatusCode`.
296     ///
297     /// # Examples
298     ///
299     /// ```
300     /// # use http::*;
301     /// let mut response: Response<()> = Response::default();
302     /// *response.status_mut() = StatusCode::CREATED;
303     /// assert_eq!(response.status(), StatusCode::CREATED);
304     /// ```
305     #[inline]
status_mut(&mut self) -> &mut StatusCode306     pub fn status_mut(&mut self) -> &mut StatusCode {
307         &mut self.head.status
308     }
309 
310     /// Returns a reference to the associated version.
311     ///
312     /// # Examples
313     ///
314     /// ```
315     /// # use http::*;
316     /// let response: Response<()> = Response::default();
317     /// assert_eq!(response.version(), Version::HTTP_11);
318     /// ```
319     #[inline]
version(&self) -> Version320     pub fn version(&self) -> Version {
321         self.head.version
322     }
323 
324     /// Returns a mutable reference to the associated version.
325     ///
326     /// # Examples
327     ///
328     /// ```
329     /// # use http::*;
330     /// let mut response: Response<()> = Response::default();
331     /// *response.version_mut() = Version::HTTP_2;
332     /// assert_eq!(response.version(), Version::HTTP_2);
333     /// ```
334     #[inline]
version_mut(&mut self) -> &mut Version335     pub fn version_mut(&mut self) -> &mut Version {
336         &mut self.head.version
337     }
338 
339     /// Returns a reference to the associated header field map.
340     ///
341     /// # Examples
342     ///
343     /// ```
344     /// # use http::*;
345     /// let response: Response<()> = Response::default();
346     /// assert!(response.headers().is_empty());
347     /// ```
348     #[inline]
headers(&self) -> &HeaderMap<HeaderValue>349     pub fn headers(&self) -> &HeaderMap<HeaderValue> {
350         &self.head.headers
351     }
352 
353     /// Returns a mutable reference to the associated header field map.
354     ///
355     /// # Examples
356     ///
357     /// ```
358     /// # use http::*;
359     /// # use http::header::*;
360     /// let mut response: Response<()> = Response::default();
361     /// response.headers_mut().insert(HOST, HeaderValue::from_static("world"));
362     /// assert!(!response.headers().is_empty());
363     /// ```
364     #[inline]
headers_mut(&mut self) -> &mut HeaderMap<HeaderValue>365     pub fn headers_mut(&mut self) -> &mut HeaderMap<HeaderValue> {
366         &mut self.head.headers
367     }
368 
369     /// Returns a reference to the associated extensions.
370     ///
371     /// # Examples
372     ///
373     /// ```
374     /// # use http::*;
375     /// let response: Response<()> = Response::default();
376     /// assert!(response.extensions().get::<i32>().is_none());
377     /// ```
378     #[inline]
extensions(&self) -> &Extensions379     pub fn extensions(&self) -> &Extensions {
380         &self.head.extensions
381     }
382 
383     /// Returns a mutable reference to the associated extensions.
384     ///
385     /// # Examples
386     ///
387     /// ```
388     /// # use http::*;
389     /// # use http::header::*;
390     /// let mut response: Response<()> = Response::default();
391     /// response.extensions_mut().insert("hello");
392     /// assert_eq!(response.extensions().get(), Some(&"hello"));
393     /// ```
394     #[inline]
extensions_mut(&mut self) -> &mut Extensions395     pub fn extensions_mut(&mut self) -> &mut Extensions {
396         &mut self.head.extensions
397     }
398 
399     /// Returns a reference to the associated HTTP body.
400     ///
401     /// # Examples
402     ///
403     /// ```
404     /// # use http::*;
405     /// let response: Response<String> = Response::default();
406     /// assert!(response.body().is_empty());
407     /// ```
408     #[inline]
body(&self) -> &T409     pub fn body(&self) -> &T {
410         &self.body
411     }
412 
413     /// Returns a mutable reference to the associated HTTP body.
414     ///
415     /// # Examples
416     ///
417     /// ```
418     /// # use http::*;
419     /// let mut response: Response<String> = Response::default();
420     /// response.body_mut().push_str("hello world");
421     /// assert!(!response.body().is_empty());
422     /// ```
423     #[inline]
body_mut(&mut self) -> &mut T424     pub fn body_mut(&mut self) -> &mut T {
425         &mut self.body
426     }
427 
428     /// Consumes the response, returning just the body.
429     ///
430     /// # Examples
431     ///
432     /// ```
433     /// # use http::Response;
434     /// let response = Response::new(10);
435     /// let body = response.into_body();
436     /// assert_eq!(body, 10);
437     /// ```
438     #[inline]
into_body(self) -> T439     pub fn into_body(self) -> T {
440         self.body
441     }
442 
443     /// Consumes the response returning the head and body parts.
444     ///
445     /// # Examples
446     ///
447     /// ```
448     /// # use http::*;
449     /// let response: Response<()> = Response::default();
450     /// let (parts, body) = response.into_parts();
451     /// assert_eq!(parts.status, StatusCode::OK);
452     /// ```
453     #[inline]
into_parts(self) -> (Parts, T)454     pub fn into_parts(self) -> (Parts, T) {
455         (self.head, self.body)
456     }
457 
458     /// Consumes the response returning a new response with body mapped to the
459     /// return type of the passed in function.
460     ///
461     /// # Examples
462     ///
463     /// ```
464     /// # use http::*;
465     /// let response = Response::builder().body("some string").unwrap();
466     /// let mapped_response: Response<&[u8]> = response.map(|b| {
467     ///   assert_eq!(b, "some string");
468     ///   b.as_bytes()
469     /// });
470     /// assert_eq!(mapped_response.body(), &"some string".as_bytes());
471     /// ```
472     #[inline]
map<F, U>(self, f: F) -> Response<U> where F: FnOnce(T) -> U,473     pub fn map<F, U>(self, f: F) -> Response<U>
474     where
475         F: FnOnce(T) -> U,
476     {
477         Response {
478             body: f(self.body),
479             head: self.head,
480         }
481     }
482 }
483 
484 impl<T: Default> Default for Response<T> {
485     #[inline]
default() -> Response<T>486     fn default() -> Response<T> {
487         Response::new(T::default())
488     }
489 }
490 
491 impl<T: fmt::Debug> fmt::Debug for Response<T> {
fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result492     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
493         f.debug_struct("Response")
494             .field("status", &self.status())
495             .field("version", &self.version())
496             .field("headers", self.headers())
497             // omits Extensions because not useful
498             .field("body", self.body())
499             .finish()
500     }
501 }
502 
503 impl Parts {
504     /// Creates a new default instance of `Parts`
new() -> Parts505     fn new() -> Parts {
506         Parts {
507             status: StatusCode::default(),
508             version: Version::default(),
509             headers: HeaderMap::default(),
510             extensions: Extensions::default(),
511             _priv: (),
512         }
513     }
514 }
515 
516 impl fmt::Debug for Parts {
fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result517     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
518         f.debug_struct("Parts")
519             .field("status", &self.status)
520             .field("version", &self.version)
521             .field("headers", &self.headers)
522             // omits Extensions because not useful
523             // omits _priv because not useful
524             .finish()
525     }
526 }
527 
528 impl Builder {
529     /// Creates a new default instance of `Builder` to construct either a
530     /// `Head` or a `Response`.
531     ///
532     /// # Examples
533     ///
534     /// ```
535     /// # use http::*;
536     ///
537     /// let response = response::Builder::new()
538     ///     .status(200)
539     ///     .body(())
540     ///     .unwrap();
541     /// ```
542     #[inline]
new() -> Builder543     pub fn new() -> Builder {
544         Builder::default()
545     }
546 
547     /// Set the HTTP status for this response.
548     ///
549     /// This function will configure the HTTP status code of the `Response` that
550     /// will be returned from `Builder::build`.
551     ///
552     /// By default this is `200`.
553     ///
554     /// # Examples
555     ///
556     /// ```
557     /// # use http::*;
558     ///
559     /// let response = Response::builder()
560     ///     .status(200)
561     ///     .body(())
562     ///     .unwrap();
563     /// ```
status<T>(self, status: T) -> Builder where StatusCode: TryFrom<T>, <StatusCode as TryFrom<T>>::Error: Into<crate::Error>,564     pub fn status<T>(self, status: T) -> Builder
565     where
566         StatusCode: TryFrom<T>,
567         <StatusCode as TryFrom<T>>::Error: Into<crate::Error>,
568     {
569         self.and_then(move |mut head| {
570             head.status = TryFrom::try_from(status).map_err(Into::into)?;
571             Ok(head)
572         })
573     }
574 
575     /// Set the HTTP version for this response.
576     ///
577     /// This function will configure the HTTP version of the `Response` that
578     /// will be returned from `Builder::build`.
579     ///
580     /// By default this is HTTP/1.1
581     ///
582     /// # Examples
583     ///
584     /// ```
585     /// # use http::*;
586     ///
587     /// let response = Response::builder()
588     ///     .version(Version::HTTP_2)
589     ///     .body(())
590     ///     .unwrap();
591     /// ```
version(self, version: Version) -> Builder592     pub fn version(self, version: Version) -> Builder {
593         self.and_then(move |mut head| {
594             head.version = version;
595             Ok(head)
596         })
597     }
598 
599     /// Appends a header to this response builder.
600     ///
601     /// This function will append the provided key/value as a header to the
602     /// internal `HeaderMap` being constructed. Essentially this is equivalent
603     /// to calling `HeaderMap::append`.
604     ///
605     /// # Examples
606     ///
607     /// ```
608     /// # use http::*;
609     /// # use http::header::HeaderValue;
610     ///
611     /// let response = Response::builder()
612     ///     .header("Content-Type", "text/html")
613     ///     .header("X-Custom-Foo", "bar")
614     ///     .header("content-length", 0)
615     ///     .body(())
616     ///     .unwrap();
617     /// ```
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>,618     pub fn header<K, V>(self, key: K, value: V) -> Builder
619     where
620         HeaderName: TryFrom<K>,
621         <HeaderName as TryFrom<K>>::Error: Into<crate::Error>,
622         HeaderValue: TryFrom<V>,
623         <HeaderValue as TryFrom<V>>::Error: Into<crate::Error>,
624     {
625         self.and_then(move |mut head| {
626             let name = <HeaderName as TryFrom<K>>::try_from(key).map_err(Into::into)?;
627             let value = <HeaderValue as TryFrom<V>>::try_from(value).map_err(Into::into)?;
628             head.headers.append(name, value);
629             Ok(head)
630         })
631     }
632 
633     /// Get header on this response builder.
634     ///
635     /// When builder has error returns None.
636     ///
637     /// # Example
638     ///
639     /// ```
640     /// # use http::Response;
641     /// # use http::header::HeaderValue;
642     /// let res = Response::builder()
643     ///     .header("Accept", "text/html")
644     ///     .header("X-Custom-Foo", "bar");
645     /// let headers = res.headers_ref().unwrap();
646     /// assert_eq!( headers["Accept"], "text/html" );
647     /// assert_eq!( headers["X-Custom-Foo"], "bar" );
648     /// ```
headers_ref(&self) -> Option<&HeaderMap<HeaderValue>>649     pub fn headers_ref(&self) -> Option<&HeaderMap<HeaderValue>> {
650         self.inner.as_ref().ok().map(|h| &h.headers)
651     }
652 
653     /// Get header on this response builder.
654     /// when builder has error returns None
655     ///
656     /// # Example
657     ///
658     /// ```
659     /// # use http::*;
660     /// # use http::header::HeaderValue;
661     /// # use http::response::Builder;
662     /// let mut res = Response::builder();
663     /// {
664     ///   let headers = res.headers_mut().unwrap();
665     ///   headers.insert("Accept", HeaderValue::from_static("text/html"));
666     ///   headers.insert("X-Custom-Foo", HeaderValue::from_static("bar"));
667     /// }
668     /// let headers = res.headers_ref().unwrap();
669     /// assert_eq!( headers["Accept"], "text/html" );
670     /// assert_eq!( headers["X-Custom-Foo"], "bar" );
671     /// ```
headers_mut(&mut self) -> Option<&mut HeaderMap<HeaderValue>>672     pub fn headers_mut(&mut self) -> Option<&mut HeaderMap<HeaderValue>> {
673         self.inner.as_mut().ok().map(|h| &mut h.headers)
674     }
675 
676     /// Adds an extension to this builder
677     ///
678     /// # Examples
679     ///
680     /// ```
681     /// # use http::*;
682     ///
683     /// let response = Response::builder()
684     ///     .extension("My Extension")
685     ///     .body(())
686     ///     .unwrap();
687     ///
688     /// assert_eq!(response.extensions().get::<&'static str>(),
689     ///            Some(&"My Extension"));
690     /// ```
extension<T>(self, extension: T) -> Builder where T: Any + Send + Sync + 'static,691     pub fn extension<T>(self, extension: T) -> Builder
692     where
693         T: Any + Send + Sync + 'static,
694     {
695         self.and_then(move |mut head| {
696             head.extensions.insert(extension);
697             Ok(head)
698         })
699     }
700 
701     /// Get a reference to the extensions for this response builder.
702     ///
703     /// If the builder has an error, this returns `None`.
704     ///
705     /// # Example
706     ///
707     /// ```
708     /// # use http::Response;
709     /// let res = Response::builder().extension("My Extension").extension(5u32);
710     /// let extensions = res.extensions_ref().unwrap();
711     /// assert_eq!(extensions.get::<&'static str>(), Some(&"My Extension"));
712     /// assert_eq!(extensions.get::<u32>(), Some(&5u32));
713     /// ```
extensions_ref(&self) -> Option<&Extensions>714     pub fn extensions_ref(&self) -> Option<&Extensions> {
715         self.inner.as_ref().ok().map(|h| &h.extensions)
716     }
717 
718     /// Get a mutable reference to the extensions for this response builder.
719     ///
720     /// If the builder has an error, this returns `None`.
721     ///
722     /// # Example
723     ///
724     /// ```
725     /// # use http::Response;
726     /// let mut res = Response::builder().extension("My Extension");
727     /// let mut extensions = res.extensions_mut().unwrap();
728     /// assert_eq!(extensions.get::<&'static str>(), Some(&"My Extension"));
729     /// extensions.insert(5u32);
730     /// assert_eq!(extensions.get::<u32>(), Some(&5u32));
731     /// ```
extensions_mut(&mut self) -> Option<&mut Extensions>732     pub fn extensions_mut(&mut self) -> Option<&mut Extensions> {
733         self.inner.as_mut().ok().map(|h| &mut h.extensions)
734     }
735 
736     /// "Consumes" this builder, using the provided `body` to return a
737     /// constructed `Response`.
738     ///
739     /// # Errors
740     ///
741     /// This function may return an error if any previously configured argument
742     /// failed to parse or get converted to the internal representation. For
743     /// example if an invalid `head` was specified via `header("Foo",
744     /// "Bar\r\n")` the error will be returned when this function is called
745     /// rather than when `header` was called.
746     ///
747     /// # Examples
748     ///
749     /// ```
750     /// # use http::*;
751     ///
752     /// let response = Response::builder()
753     ///     .body(())
754     ///     .unwrap();
755     /// ```
body<T>(self, body: T) -> Result<Response<T>>756     pub fn body<T>(self, body: T) -> Result<Response<T>> {
757         self.inner.map(move |head| {
758             Response {
759                 head,
760                 body,
761             }
762         })
763     }
764 
765     // private
766 
and_then<F>(self, func: F) -> Self where F: FnOnce(Parts) -> Result<Parts>767     fn and_then<F>(self, func: F) -> Self
768     where
769         F: FnOnce(Parts) -> Result<Parts>
770     {
771         Builder {
772             inner: self.inner.and_then(func),
773         }
774     }
775 }
776 
777 impl Default for Builder {
778     #[inline]
default() -> Builder779     fn default() -> Builder {
780         Builder {
781             inner: Ok(Parts::new()),
782         }
783     }
784 }
785 
786 #[cfg(test)]
787 mod tests {
788     use super::*;
789 
790     #[test]
it_can_map_a_body_from_one_type_to_another()791     fn it_can_map_a_body_from_one_type_to_another() {
792         let response = Response::builder().body("some string").unwrap();
793         let mapped_response = response.map(|s| {
794             assert_eq!(s, "some string");
795             123u32
796         });
797         assert_eq!(mapped_response.body(), &123u32);
798     }
799 }
800