diff --git a/tonic/src/status.rs b/tonic/src/status.rs index 0008edcb1..ef9731ad1 100644 --- a/tonic/src/status.rs +++ b/tonic/src/status.rs @@ -305,12 +305,14 @@ impl Status { } #[cfg_attr(not(feature = "transport"), allow(dead_code))] - pub(crate) fn from_error(err: Box) -> Status { + pub(crate) fn from_error(err: Box) -> Status { Status::try_from_error(err) .unwrap_or_else(|err| Status::new(Code::Unknown, err.to_string())) } - pub(crate) fn try_from_error(err: Box) -> Result> { + pub(crate) fn try_from_error( + err: Box, + ) -> Result> { let err = match err.downcast::() { Ok(status) => { return Ok(*status); @@ -318,6 +320,12 @@ impl Status { Err(err) => err, }; + #[cfg(feature = "transport")] + let err = match err.downcast::() { + Ok(timeout) => return Ok(Status::cancelled(timeout.to_string())), + Err(err) => err, + }; + #[cfg(feature = "transport")] let err = match err.downcast::() { Ok(h2) => { @@ -586,9 +594,9 @@ fn invalid_header_value_byte(err: Error) -> Status { } impl TryFrom> for Status { - type Error = Box; + type Error = Box; - fn try_from(err: Box) -> Result { + fn try_from(err: Box) -> Result { Status::try_from_error(err) } } diff --git a/tonic/src/transport/server/recover_error.rs b/tonic/src/transport/server/recover_error.rs index 72b6bf82b..f756e960f 100644 --- a/tonic/src/transport/server/recover_error.rs +++ b/tonic/src/transport/server/recover_error.rs @@ -67,15 +67,14 @@ where let response = response.map(MaybeEmptyBody::full); Poll::Ready(Ok(response)) } - Err(err) => { - if let Some(status) = Status::try_from_error(&*err) { + Err(err) => match Status::try_from_error(err) { + Ok(status) => { let mut res = Response::new(MaybeEmptyBody::empty()); status.add_header(res.headers_mut()).unwrap(); Poll::Ready(Ok(res)) - } else { - Poll::Ready(Err(err)) } - } + Err(err) => Poll::Ready(Err(err)), + }, } } }