diff --git a/api/src/main/java/io/grpc/ClientStreamTracer.java b/api/src/main/java/io/grpc/ClientStreamTracer.java index 55751dd3fd..2f366b7404 100644 --- a/api/src/main/java/io/grpc/ClientStreamTracer.java +++ b/api/src/main/java/io/grpc/ClientStreamTracer.java @@ -70,10 +70,23 @@ public abstract class ClientStreamTracer extends StreamTracer { } /** - * Trailing metadata has been received from the server. + * Headers has been received from the server. This method does not pass ownership to {@code + * headers}, so implementations must not access the metadata after returning. Modifications to the + * metadata within this method will be seen by interceptors and the application. * - * @param trailers the mutable trailing metadata. Modifications to it will be seen by - * interceptors and the application. + * @param headers the received header metadata + */ + public void inboundHeaders(Metadata headers) { + inboundHeaders(); + } + + /** + * Trailing metadata has been received from the server. This method does not pass ownership to + * {@code trailers}, so implementations must not access the metadata after returning. + * Modifications to the metadata within this method will be seen by interceptors and the + * application. + * + * @param trailers the received trailing metadata * @since 1.17.0 */ public void inboundTrailers(Metadata trailers) { diff --git a/binder/src/main/java/io/grpc/binder/internal/Inbound.java b/binder/src/main/java/io/grpc/binder/internal/Inbound.java index 5ab96085a4..23f11ccda8 100644 --- a/binder/src/main/java/io/grpc/binder/internal/Inbound.java +++ b/binder/src/main/java/io/grpc/binder/internal/Inbound.java @@ -579,7 +579,7 @@ abstract class Inbound implements StreamListener.Messa @GuardedBy("this") protected void handlePrefix(int flags, Parcel parcel) throws StatusException { Metadata headers = MetadataHelper.readMetadata(parcel, attributes); - statsTraceContext.clientInboundHeaders(); + statsTraceContext.clientInboundHeaders(headers); listener.headersRead(headers); } diff --git a/core/src/main/java/io/grpc/internal/AbstractClientStream.java b/core/src/main/java/io/grpc/internal/AbstractClientStream.java index e929716e8c..51c31993f4 100644 --- a/core/src/main/java/io/grpc/internal/AbstractClientStream.java +++ b/core/src/main/java/io/grpc/internal/AbstractClientStream.java @@ -304,7 +304,7 @@ public abstract class AbstractClientStream extends AbstractStream */ protected void inboundHeadersReceived(Metadata headers) { checkState(!statusReported, "Received headers on closed stream"); - statsTraceCtx.clientInboundHeaders(); + statsTraceCtx.clientInboundHeaders(headers); boolean compressedStream = false; String streamEncoding = headers.get(CONTENT_ENCODING_KEY); diff --git a/core/src/main/java/io/grpc/internal/ForwardingClientStreamTracer.java b/core/src/main/java/io/grpc/internal/ForwardingClientStreamTracer.java index b3e9b216de..e7679ea14c 100644 --- a/core/src/main/java/io/grpc/internal/ForwardingClientStreamTracer.java +++ b/core/src/main/java/io/grpc/internal/ForwardingClientStreamTracer.java @@ -49,6 +49,11 @@ public abstract class ForwardingClientStreamTracer extends ClientStreamTracer { delegate().inboundHeaders(); } + @Override + public void inboundHeaders(Metadata headers) { + delegate().inboundHeaders(headers); + } + @Override public void inboundTrailers(Metadata trailers) { delegate().inboundTrailers(trailers); diff --git a/core/src/main/java/io/grpc/internal/StatsTraceContext.java b/core/src/main/java/io/grpc/internal/StatsTraceContext.java index 889be30e71..650f0b979a 100644 --- a/core/src/main/java/io/grpc/internal/StatsTraceContext.java +++ b/core/src/main/java/io/grpc/internal/StatsTraceContext.java @@ -101,9 +101,9 @@ public final class StatsTraceContext { * *

Called from abstract stream implementations. */ - public void clientInboundHeaders() { + public void clientInboundHeaders(Metadata headers) { for (StreamTracer tracer : tracers) { - ((ClientStreamTracer) tracer).inboundHeaders(); + ((ClientStreamTracer) tracer).inboundHeaders(headers); } } diff --git a/inprocess/src/main/java/io/grpc/inprocess/InProcessTransport.java b/inprocess/src/main/java/io/grpc/inprocess/InProcessTransport.java index f091714874..01f6a07894 100644 --- a/inprocess/src/main/java/io/grpc/inprocess/InProcessTransport.java +++ b/inprocess/src/main/java/io/grpc/inprocess/InProcessTransport.java @@ -571,7 +571,7 @@ final class InProcessTransport implements ServerTransport, ConnectionClientTrans return; } - clientStream.statsTraceCtx.clientInboundHeaders(); + clientStream.statsTraceCtx.clientInboundHeaders(headers); syncContext.executeLater(() -> clientStreamListener.headersRead(headers)); } syncContext.drain(); diff --git a/util/src/main/java/io/grpc/util/ForwardingClientStreamTracer.java b/util/src/main/java/io/grpc/util/ForwardingClientStreamTracer.java index b173b3f5e2..9c9998571e 100644 --- a/util/src/main/java/io/grpc/util/ForwardingClientStreamTracer.java +++ b/util/src/main/java/io/grpc/util/ForwardingClientStreamTracer.java @@ -48,6 +48,11 @@ public abstract class ForwardingClientStreamTracer extends ClientStreamTracer { delegate().inboundHeaders(); } + @Override + public void inboundHeaders(Metadata headers) { + delegate().inboundHeaders(headers); + } + @Override public void inboundTrailers(Metadata trailers) { delegate().inboundTrailers(trailers);