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
This commit is contained in:
Eric Anderson 2016-07-08 15:16:14 -07:00
parent 0d6a9de54c
commit 0e47be1287
1 changed files with 5 additions and 7 deletions

View File

@ -62,7 +62,7 @@ final class ServerCallImpl<ReqT, RespT> extends ServerCall<ReqT, RespT> {
private final ServerStream stream;
private final MethodDescriptor<ReqT, RespT> 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<ReqT, RespT> extends ServerCall<ReqT, RespT> {
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<ReqT, RespT> extends ServerCall<ReqT, RespT> {
if (compressor == null) {
compressor = Codec.Identity.NONE;
} else {
if (inboundHeaders.containsKey(MESSAGE_ACCEPT_ENCODING_KEY)) {
String acceptEncodings = inboundHeaders.get(MESSAGE_ACCEPT_ENCODING_KEY);
List<String> acceptedEncodingsList = ACCEPT_ENCODING_SPLITER.splitToList(acceptEncodings);
if (messageAcceptEncoding != null) {
List<String> 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<ReqT, RespT> extends ServerCall<ReqT, RespT> {
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<ReqT, RespT> extends ServerCall<ReqT, RespT> {
public void close(Status status, Metadata trailers) {
checkState(!closeCalled, "call already closed");
closeCalled = true;
inboundHeaders = null;
stream.close(status, trailers);
}