From 0e47be12878fe1dfb0504ed43ec8f363fe9eb1ce Mon Sep 17 00:00:00 2001 From: Eric Anderson Date: Fri, 8 Jul 2016 15:16:14 -0700 Subject: [PATCH] core: Save accept encoding since Metadata is not thread-safe Metadata has been passed to the application. The application may be modifying Metadata concurrently, so we must not access Metadata after that point. Fixes #1947 --- .../main/java/io/grpc/internal/ServerCallImpl.java | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/core/src/main/java/io/grpc/internal/ServerCallImpl.java b/core/src/main/java/io/grpc/internal/ServerCallImpl.java index 6e0707b329..d2a4e90294 100644 --- a/core/src/main/java/io/grpc/internal/ServerCallImpl.java +++ b/core/src/main/java/io/grpc/internal/ServerCallImpl.java @@ -62,7 +62,7 @@ final class ServerCallImpl extends ServerCall { private final ServerStream stream; private final MethodDescriptor method; private final Context.CancellableContext context; - private Metadata inboundHeaders; + private final String messageAcceptEncoding; private final DecompressorRegistry decompressorRegistry; private final CompressorRegistry compressorRegistry; @@ -78,7 +78,7 @@ final class ServerCallImpl extends ServerCall { this.stream = stream; this.method = method; this.context = context; - this.inboundHeaders = inboundHeaders; + this.messageAcceptEncoding = inboundHeaders.get(MESSAGE_ACCEPT_ENCODING_KEY); this.decompressorRegistry = decompressorRegistry; this.compressorRegistry = compressorRegistry; @@ -108,9 +108,9 @@ final class ServerCallImpl extends ServerCall { if (compressor == null) { compressor = Codec.Identity.NONE; } else { - if (inboundHeaders.containsKey(MESSAGE_ACCEPT_ENCODING_KEY)) { - String acceptEncodings = inboundHeaders.get(MESSAGE_ACCEPT_ENCODING_KEY); - List acceptedEncodingsList = ACCEPT_ENCODING_SPLITER.splitToList(acceptEncodings); + if (messageAcceptEncoding != null) { + List acceptedEncodingsList = + ACCEPT_ENCODING_SPLITER.splitToList(messageAcceptEncoding); if (!acceptedEncodingsList.contains(compressor.getMessageEncoding())) { // resort to using no compression. compressor = Codec.Identity.NONE; @@ -119,7 +119,6 @@ final class ServerCallImpl extends ServerCall { compressor = Codec.Identity.NONE; } } - inboundHeaders = null; // Always put compressor, even if it's identity. headers.put(MESSAGE_ENCODING_KEY, compressor.getMessageEncoding()); @@ -178,7 +177,6 @@ final class ServerCallImpl extends ServerCall { public void close(Status status, Metadata trailers) { checkState(!closeCalled, "call already closed"); closeCalled = true; - inboundHeaders = null; stream.close(status, trailers); }