@@ -15,7 +15,7 @@ use crate::headers::{
15
15
} ;
16
16
use crate :: mime:: Mime ;
17
17
use crate :: trailers:: { self , Trailers } ;
18
- use crate :: { Body , Extensions , StatusCode , Version } ;
18
+ use crate :: { Body , Error , Extensions , StatusCode , Version } ;
19
19
20
20
cfg_unstable ! {
21
21
use crate :: upgrade;
@@ -50,6 +50,7 @@ pin_project_lite::pin_project! {
50
50
ext: Extensions ,
51
51
local_addr: Option <String >,
52
52
peer_addr: Option <String >,
53
+ error: Option <Error >,
53
54
}
54
55
}
55
56
@@ -85,6 +86,7 @@ pin_project_lite::pin_project! {
85
86
ext: Extensions ,
86
87
local_addr: Option <String >,
87
88
peer_addr: Option <String >,
89
+ error: Option <Error >,
88
90
}
89
91
}
90
92
@@ -111,6 +113,7 @@ impl Response {
111
113
ext : Extensions :: new ( ) ,
112
114
peer_addr : None ,
113
115
local_addr : None ,
116
+ error : None ,
114
117
}
115
118
}
116
119
@@ -140,6 +143,7 @@ impl Response {
140
143
ext : Extensions :: new ( ) ,
141
144
peer_addr : None ,
142
145
local_addr : None ,
146
+ error : None ,
143
147
}
144
148
}
145
149
@@ -469,6 +473,16 @@ impl Response {
469
473
self . body . is_empty ( )
470
474
}
471
475
476
+ /// Returns an optional reference to the `Error` if the response was created from one, or else `None`.
477
+ pub fn error ( & self ) -> Option < & Error > {
478
+ self . error . as_ref ( )
479
+ }
480
+
481
+ /// Takes the `Error` from the response if one exists, replacing it with `None`.
482
+ pub fn take_error ( & mut self ) -> Option < Error > {
483
+ self . error . take ( )
484
+ }
485
+
472
486
/// Get the HTTP version, if one has been set.
473
487
///
474
488
/// # Examples
@@ -641,8 +655,10 @@ impl Response {
641
655
}
642
656
643
657
impl Clone for Response {
644
- /// Clone the response, resolving the body to `Body::empty()` and removing
645
- /// extensions.
658
+ /// Clone the response, with some exceptions:
659
+ /// - The body is resolved to `Body::empty()`.
660
+ /// - Any attached extensions are not cloned.
661
+ /// - Any attached error is not cloned.
646
662
fn clone ( & self ) -> Self {
647
663
Self {
648
664
status : self . status . clone ( ) ,
@@ -661,6 +677,7 @@ impl Clone for Response {
661
677
ext : Extensions :: new ( ) ,
662
678
peer_addr : self . peer_addr . clone ( ) ,
663
679
local_addr : self . local_addr . clone ( ) ,
680
+ error : None ,
664
681
}
665
682
}
666
683
}
@@ -733,6 +750,58 @@ impl Index<&str> for Response {
733
750
}
734
751
}
735
752
753
+ #[ cfg( not( feature = "unstable" ) ) ]
754
+ impl From < Error > for Response {
755
+ /// Create a new response from an `http_types::Error`.
756
+ ///
757
+ /// This will store the error in the `Response`, allowing it to later be
758
+ /// checked via `Response::error()`.
759
+ fn from ( error : Error ) -> Self {
760
+ let ( trailers_sender, trailers_receiver) = sync:: channel ( 1 ) ;
761
+ Self {
762
+ status : error. status ( ) ,
763
+ headers : Headers :: new ( ) ,
764
+ version : None ,
765
+ body : Body :: empty ( ) ,
766
+ trailers_sender : Some ( trailers_sender) ,
767
+ trailers_receiver : Some ( trailers_receiver) ,
768
+ has_trailers : false ,
769
+ ext : Extensions :: new ( ) ,
770
+ peer_addr : None ,
771
+ local_addr : None ,
772
+ error : Some ( error) ,
773
+ }
774
+ }
775
+ }
776
+
777
+ #[ cfg( feature = "unstable" ) ]
778
+ impl From < Error > for Response {
779
+ /// Create a new response from an `http_types::Error`.
780
+ ///
781
+ /// This will store the error in the `Response`, allowing it to later be
782
+ /// checked via `Response::error()`.
783
+ fn from ( error : Error ) -> Self {
784
+ let ( trailers_sender, trailers_receiver) = sync:: channel ( 1 ) ;
785
+ let ( upgrade_sender, upgrade_receiver) = sync:: channel ( 1 ) ;
786
+ Self {
787
+ status : error. status ( ) ,
788
+ headers : Headers :: new ( ) ,
789
+ version : None ,
790
+ body : Body :: empty ( ) ,
791
+ trailers_sender : Some ( trailers_sender) ,
792
+ trailers_receiver : Some ( trailers_receiver) ,
793
+ has_trailers : false ,
794
+ upgrade_sender : Some ( upgrade_sender) ,
795
+ upgrade_receiver : Some ( upgrade_receiver) ,
796
+ has_upgrade : false ,
797
+ ext : Extensions :: new ( ) ,
798
+ peer_addr : None ,
799
+ local_addr : None ,
800
+ error : Some ( error) ,
801
+ }
802
+ }
803
+ }
804
+
736
805
impl From < StatusCode > for Response {
737
806
fn from ( s : StatusCode ) -> Self {
738
807
Response :: new ( s)
0 commit comments