From 9a0320e14b9227dfb50883373e0682df6783e121 Mon Sep 17 00:00:00 2001 From: Zhixin Wen Date: Thu, 11 Apr 2024 15:30:44 -0700 Subject: [PATCH 1/2] Expose Error Status To Caller --- tonic/src/codec/decode.rs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/tonic/src/codec/decode.rs b/tonic/src/codec/decode.rs index 081f6193d..9673fa7f9 100644 --- a/tonic/src/codec/decode.rs +++ b/tonic/src/codec/decode.rs @@ -4,6 +4,7 @@ use crate::{body::BoxBody, metadata::MetadataMap, Code, Status}; use bytes::{Buf, BufMut, BytesMut}; use http::StatusCode; use http_body::Body; +use std::os::macos::raw::stat; use std::{ fmt, future, pin::Pin, @@ -35,14 +36,14 @@ struct StreamingInner { impl Unpin for Streaming {} -#[derive(Debug, Clone, Copy)] +#[derive(Debug, Clone)] enum State { ReadHeader, ReadBody { compression: Option, len: usize, }, - Error, + Error(Status), } #[derive(Debug, PartialEq, Eq)] @@ -247,7 +248,7 @@ impl StreamingInner { return Poll::Ready(Ok(None)); } - let _ = std::mem::replace(&mut self.state, State::Error); + let _ = std::mem::replace(&mut self.state, State::Error(status.clone())); debug!("decoder inner stream error: {:?}", status); return Poll::Ready(Err(status)); } @@ -391,8 +392,8 @@ impl Stream for Streaming { fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { loop { - if let State::Error = &self.inner.state { - return Poll::Ready(None); + if let State::Error(status) = &self.inner.state { + return Poll::Ready(Some(Err(status.clone()))); } // FIXME: implement the ability to poll trailers when we _know_ that From ec44b56f5688773db5b3cb9316d845daaf76961a Mon Sep 17 00:00:00 2001 From: Zhixin Wen Date: Thu, 11 Apr 2024 15:32:32 -0700 Subject: [PATCH 2/2] clean --- tonic/src/codec/decode.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/tonic/src/codec/decode.rs b/tonic/src/codec/decode.rs index 9673fa7f9..5d35db0c7 100644 --- a/tonic/src/codec/decode.rs +++ b/tonic/src/codec/decode.rs @@ -4,7 +4,6 @@ use crate::{body::BoxBody, metadata::MetadataMap, Code, Status}; use bytes::{Buf, BufMut, BytesMut}; use http::StatusCode; use http_body::Body; -use std::os::macos::raw::stat; use std::{ fmt, future, pin::Pin,