@@ -3,7 +3,7 @@ use crate::metadata::MetadataMap;
3
3
use bytes:: Bytes ;
4
4
use http:: header:: { HeaderMap , HeaderValue } ;
5
5
use percent_encoding:: { percent_decode, percent_encode, AsciiSet , CONTROLS } ;
6
- use std:: { borrow:: Cow , error:: Error , fmt} ;
6
+ use std:: { borrow:: Cow , error:: Error , fmt, sync :: Arc } ;
7
7
use tracing:: { debug, trace, warn} ;
8
8
9
9
const ENCODING_SET : & AsciiSet = & CONTROLS
@@ -33,6 +33,7 @@ const GRPC_STATUS_DETAILS_HEADER: &str = "grpc-status-details-bin";
33
33
/// assert_eq!(status1.code(), Code::InvalidArgument);
34
34
/// assert_eq!(status1.code(), status2.code());
35
35
/// ```
36
+ #[ derive( Clone ) ]
36
37
pub struct Status {
37
38
/// The gRPC status code, found in the `grpc-status` header.
38
39
code : Code ,
@@ -45,7 +46,7 @@ pub struct Status {
45
46
/// or by `Status` fields above, they will be ignored.
46
47
metadata : MetadataMap ,
47
48
/// Optional underlying error.
48
- source : Option < Box < dyn Error + Send + Sync + ' static > > ,
49
+ source : Option < Arc < dyn Error + Send + Sync + ' static > > ,
49
50
}
50
51
51
52
/// gRPC status codes used by [`Status`].
@@ -318,7 +319,7 @@ impl Status {
318
319
pub fn from_error ( err : Box < dyn Error + Send + Sync + ' static > ) -> Status {
319
320
Status :: try_from_error ( err) . unwrap_or_else ( |err| {
320
321
let mut status = Status :: new ( Code :: Unknown , err. to_string ( ) ) ;
321
- status. source = Some ( err) ;
322
+ status. source = Some ( err. into ( ) ) ;
322
323
status
323
324
} )
324
325
}
@@ -342,7 +343,7 @@ impl Status {
342
343
} ;
343
344
344
345
if let Some ( mut status) = find_status_in_source_chain ( & * err) {
345
- status. source = Some ( err) ;
346
+ status. source = Some ( err. into ( ) ) ;
346
347
return Ok ( status) ;
347
348
}
348
349
@@ -370,7 +371,7 @@ impl Status {
370
371
} ;
371
372
372
373
let mut status = Self :: new ( code, format ! ( "h2 protocol error: {}" , err) ) ;
373
- status. source = Some ( err) ;
374
+ status. source = Some ( Arc :: new ( * err) ) ;
374
375
status
375
376
}
376
377
0 commit comments