@@ -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,21 @@ 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
+
486
+ /// Sets an `Error` on the response, accessible via `error()` and `take_error()`.
487
+ pub fn set_error ( & mut self , error : Error ) {
488
+ self . error = Some ( error) ;
489
+ }
490
+
472
491
/// Get the HTTP version, if one has been set.
473
492
///
474
493
/// # Examples
@@ -641,8 +660,10 @@ impl Response {
641
660
}
642
661
643
662
impl Clone for Response {
644
- /// Clone the response, resolving the body to `Body::empty()` and removing
645
- /// extensions.
663
+ /// Clone the response, with some exceptions:
664
+ /// - The body is resolved to `Body::empty()`.
665
+ /// - Any attached extensions are not cloned.
666
+ /// - Any attached error is not cloned.
646
667
fn clone ( & self ) -> Self {
647
668
Self {
648
669
status : self . status . clone ( ) ,
@@ -661,6 +682,7 @@ impl Clone for Response {
661
682
ext : Extensions :: new ( ) ,
662
683
peer_addr : self . peer_addr . clone ( ) ,
663
684
local_addr : self . local_addr . clone ( ) ,
685
+ error : None ,
664
686
}
665
687
}
666
688
}
@@ -733,6 +755,58 @@ impl Index<&str> for Response {
733
755
}
734
756
}
735
757
758
+ #[ cfg( not( feature = "unstable" ) ) ]
759
+ impl From < Error > for Response {
760
+ /// Create a new response from an `http_types::Error`.
761
+ ///
762
+ /// This will store the error in the `Response`, allowing it to later be
763
+ /// checked via `Response::error()`.
764
+ fn from ( error : Error ) -> Self {
765
+ let ( trailers_sender, trailers_receiver) = sync:: channel ( 1 ) ;
766
+ Self {
767
+ status : error. status ( ) ,
768
+ headers : Headers :: new ( ) ,
769
+ version : None ,
770
+ body : Body :: empty ( ) ,
771
+ trailers_sender : Some ( trailers_sender) ,
772
+ trailers_receiver : Some ( trailers_receiver) ,
773
+ has_trailers : false ,
774
+ ext : Extensions :: new ( ) ,
775
+ peer_addr : None ,
776
+ local_addr : None ,
777
+ error : Some ( error) ,
778
+ }
779
+ }
780
+ }
781
+
782
+ #[ cfg( feature = "unstable" ) ]
783
+ impl From < Error > for Response {
784
+ /// Create a new response from an `http_types::Error`.
785
+ ///
786
+ /// This will store the error in the `Response`, allowing it to later be
787
+ /// checked via `Response::error()`.
788
+ fn from ( error : Error ) -> Self {
789
+ let ( trailers_sender, trailers_receiver) = sync:: channel ( 1 ) ;
790
+ let ( upgrade_sender, upgrade_receiver) = sync:: channel ( 1 ) ;
791
+ Self {
792
+ status : error. status ( ) ,
793
+ headers : Headers :: new ( ) ,
794
+ version : None ,
795
+ body : Body :: empty ( ) ,
796
+ trailers_sender : Some ( trailers_sender) ,
797
+ trailers_receiver : Some ( trailers_receiver) ,
798
+ has_trailers : false ,
799
+ upgrade_sender : Some ( upgrade_sender) ,
800
+ upgrade_receiver : Some ( upgrade_receiver) ,
801
+ has_upgrade : false ,
802
+ ext : Extensions :: new ( ) ,
803
+ peer_addr : None ,
804
+ local_addr : None ,
805
+ error : Some ( error) ,
806
+ }
807
+ }
808
+ }
809
+
736
810
impl From < StatusCode > for Response {
737
811
fn from ( s : StatusCode ) -> Self {
738
812
Response :: new ( s)
0 commit comments