Add trailing metadata for unary/client-streaming

This commit is contained in:
Lucio Franco
2019-08-28 23:15:05 -04:00
parent bfab56d42d
commit 91a3c0965a
5 changed files with 34 additions and 25 deletions
+14 -17
View File
@@ -402,22 +402,21 @@ pub async fn custom_metadata(client: &mut Client, assertions: &mut Vec<TestAsser
req_stream.metadata_mut().insert(key1, value1.clone());
req_stream.metadata_mut().insert_bin(key2, value2.clone());
// let response = client
// .unary_call(req_unary)
// .await
// .expect("call should pass.");
// assertions.push(test_assert!(
// "metadata string must match in unary",
// response.metadata().get(key1) == Some(&value1),
// format!("result={:?}", response.metadata().get(key1))
// ));
// assertions.push(test_assert!(
// "metadata bin must match in unary",
// response.metadata().get_bin(key2) == Some(&value2),
// format!("result={:?}", response.metadata().get_bin(key1))
// ));
let response = client
.unary_call(req_unary)
.await
.expect("call should pass.");
assertions.push(test_assert!(
"metadata string must match in unary",
response.metadata().get(key1) == Some(&value1),
format!("result={:?}", response.metadata().get(key1))
));
assertions.push(test_assert!(
"metadata bin must match in unary",
response.metadata().get_bin(key2) == Some(&value2),
format!("result={:?}", response.metadata().get_bin(key1))
));
let response = client
.full_duplex_call(req_stream)
@@ -432,8 +431,6 @@ pub async fn custom_metadata(client: &mut Client, assertions: &mut Vec<TestAsser
let mut stream = response.into_inner();
// while let Some(_) = stream.next().await {}
let trailers = stream.trailers().await.unwrap().unwrap();
assertions.push(test_assert!(
+5 -1
View File
@@ -77,7 +77,7 @@ impl<T> Grpc<T> {
M1: Send,
M2: Send + Unpin + 'static,
{
let (parts, body) = self.streaming(request, path, codec).await?.into_parts();
let (mut parts, body) = self.streaming(request, path, codec).await?.into_parts();
futures_util::pin_mut!(body);
@@ -86,6 +86,10 @@ impl<T> Grpc<T> {
.await?
.ok_or(Status::new(Code::Internal, "Missing response message."))?;
if let Some(trailers) = body.trailers().await? {
parts.merge(trailers);
}
Ok(Response::from_parts(parts, message))
}
+3 -4
View File
@@ -91,10 +91,10 @@ impl<T> Streaming<T> {
future::poll_fn(|cx| Pin::new(&mut *self).poll_next(cx)).await
}
pub async fn trailers(mut self) -> Result<Option<MetadataMap>, Status> {
pub async fn trailers(&mut self) -> Result<Option<MetadataMap>, Status> {
// Shortcut to see if we already pulled the trailers in the stream step
// we need to do that so that the stream can error on trailing grpc-status
if let Some(trailers) = self.trailers {
if let Some(trailers) = self.trailers.take() {
return Ok(Some(trailers));
}
@@ -105,11 +105,10 @@ impl<T> Streaming<T> {
// Since we call poll_trailers internally on poll_next we need to
// check if it got cached again.
if let Some(trailers) = self.trailers {
if let Some(trailers) = self.trailers.take() {
return Ok(Some(trailers));
}
// Trailers were not caught during poll_next and thus lets poll for
// them manually.
let map =
+4
View File
@@ -1181,6 +1181,10 @@ impl MetadataMap {
{
key.remove(self)
}
pub(crate) fn merge(&mut self, other: MetadataMap) {
self.headers.extend(other.headers);
}
}
// ===== impl Iter =====
+8 -3
View File
@@ -136,7 +136,14 @@ where
.await?
.ok_or(Status::new(Code::Internal, "Missing request message."))?;
Ok(Request::from_http_parts(parts, message))
let mut req = Request::from_http_parts(parts, message);
if let Some(trailers) = stream.trailers().await? {
req.metadata_mut().merge(trailers);
}
Ok(req)
}
fn map_request_streaming<B>(
@@ -170,8 +177,6 @@ where
let body = encode_server(self.codec.encoder(), body.into_stream());
// FIXME: try to return impl Trait?
// let body = Box::pin(body) as BoxStream<BytesBuf>;
http::Response::from_parts(parts, BoxBody::new(body))
}
Err(status) => {