diff --git a/examples/src/tower/client.rs b/examples/src/tower/client.rs index 1f136f2c2..aa3135dba 100644 --- a/examples/src/tower/client.rs +++ b/examples/src/tower/client.rs @@ -56,12 +56,17 @@ mod service { } fn call(&mut self, req: Request) -> Self::Future { - let mut channel = self.inner.clone(); + // This is necessary because tonic internally uses `tower::buffer::Buffer`. + // See https://github.com/tower-rs/tower/issues/547#issuecomment-767629149 + // for details on why this is necessary + let clone = self.inner.clone(); + let mut inner = std::mem::replace(&mut self.inner, clone); Box::pin(async move { // Do extra async work here... + let response = inner.call(req).await?; - channel.call(req).await.map_err(Into::into) + Ok(response) }) } } diff --git a/examples/src/tower/server.rs b/examples/src/tower/server.rs index d25097049..574b76b7f 100644 --- a/examples/src/tower/server.rs +++ b/examples/src/tower/server.rs @@ -71,12 +71,17 @@ where } fn call(&mut self, req: HyperRequest) -> Self::Future { - let mut svc = self.inner.clone(); + // This is necessary because tonic internally uses `tower::buffer::Buffer`. + // See https://github.com/tower-rs/tower/issues/547#issuecomment-767629149 + // for details on why this is necessary + let clone = self.inner.clone(); + let mut inner = std::mem::replace(&mut self.inner, clone); Box::pin(async move { - // Do async work here.... + // Do extra async work here... + let response = inner.call(req).await?; - svc.call(req).await + Ok(response) }) } }