From f58fcf31d1b725416b7f457e2d12e6aaa7e6f327 Mon Sep 17 00:00:00 2001 From: Jake Goulding Date: Mon, 14 Dec 2020 14:20:15 -0500 Subject: [PATCH] Merge trailer and inital headers into status on err (#510) The C++ gRPC server sometimes returns both headers and trailers. An excerpt from Wireshark: ``` Stream: HEADERS, Stream ID: 1, Length 136, 200 OK Header: :status: 200 OK Header: x-middleware: expected value Header: content-type: application/grpc Header: grpc-accept-encoding: identity,deflate,gzip Header: accept-encoding: identity,gzip Stream: HEADERS, Stream ID: 1, Length 92 Header: grpc-status: 2 Header: grpc-message: Unknown Header: x-arrow-status: 9 Header: x-arrow-status-message-bin: VW5rbm93bg ``` Before this commit, only the metadata from the trailer would be available, missing the `x-middleware` header: ``` MetadataMap { headers: { "x-arrow-status-message-bin": "VW5rbm93bg", "x-arrow-status": "9", }, } ``` --- tonic/src/client/grpc.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tonic/src/client/grpc.rs b/tonic/src/client/grpc.rs index 6a42b4022..2e3c2de85 100644 --- a/tonic/src/client/grpc.rs +++ b/tonic/src/client/grpc.rs @@ -103,7 +103,11 @@ impl Grpc { let message = body .try_next() - .await? + .await + .map_err(|mut status| { + status.metadata_mut().merge(parts.clone()); + status + })? .ok_or_else(|| Status::new(Code::Internal, "Missing response message."))?; if let Some(trailers) = body.trailers().await? {