From a6d638c5f6c63c7c805fdb9b61c18cadcf0f7a3f Mon Sep 17 00:00:00 2001 From: Jasper Moeys Date: Mon, 5 Sep 2022 16:23:45 +0200 Subject: [PATCH] create defensive copy of grpc.Metadata fixes #41 --- .../scala/monix/grpc/runtime/client/ClientCall.scala | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/grpc-runtime/src/main/scala/monix/grpc/runtime/client/ClientCall.scala b/grpc-runtime/src/main/scala/monix/grpc/runtime/client/ClientCall.scala index d58114a..ca323ad 100644 --- a/grpc-runtime/src/main/scala/monix/grpc/runtime/client/ClientCall.scala +++ b/grpc-runtime/src/main/scala/monix/grpc/runtime/client/ClientCall.scala @@ -194,10 +194,19 @@ class ClientCall[Request, Response] private[client] ( case Right(_) => Task.raiseError(err) } + private def copy(origHeaders: grpc.Metadata): grpc.Metadata = { + val newHeaders = new grpc.Metadata() + newHeaders.merge(origHeaders) + newHeaders + } + + /** + * Creates a copy of the headers, because call.start can mutate them. + */ private def start( listener: grpc.ClientCall.Listener[Response], headers: grpc.Metadata - ): Task[Unit] = Task(call.start(listener, headers)) + ): Task[Unit] = Task(call.start(listener, copy(headers))) /** * Asks for two messages even though we expect only one so that if a