From 9727739c7cdc50f5304e1612f8c83d79e70dad89 Mon Sep 17 00:00:00 2001 From: Alex Panchenko <440271+panchenko@users.noreply.github.com> Date: Wed, 20 Aug 2025 13:46:03 +0200 Subject: [PATCH 1/4] servlet: extract ServletServerStream.serializeHeaders() --- .../io/grpc/servlet/ServletServerStream.java | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/servlet/src/main/java/io/grpc/servlet/ServletServerStream.java b/servlet/src/main/java/io/grpc/servlet/ServletServerStream.java index 5dd20567c08..2f9aee80d71 100644 --- a/servlet/src/main/java/io/grpc/servlet/ServletServerStream.java +++ b/servlet/src/main/java/io/grpc/servlet/ServletServerStream.java @@ -45,6 +45,7 @@ import java.util.Map; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; +import java.util.function.BiConsumer; import java.util.function.Supplier; import java.util.logging.Logger; import javax.annotation.Nullable; @@ -123,9 +124,13 @@ private void writeHeadersToServletResponse(Metadata metadata) { resp.setStatus(HttpServletResponse.SC_OK); resp.setContentType(CONTENT_TYPE_GRPC); + serializeHeaders(metadata, resp::addHeader); + } + + private static void serializeHeaders(Metadata metadata, BiConsumer consumer) { byte[][] serializedHeaders = TransportFrameUtil.toHttp2Headers(metadata); for (int i = 0; i < serializedHeaders.length; i += 2) { - resp.addHeader( + consumer.accept( new String(serializedHeaders[i], StandardCharsets.US_ASCII), new String(serializedHeaders[i + 1], StandardCharsets.US_ASCII)); } @@ -278,13 +283,8 @@ public void writeTrailers(Metadata trailers, boolean headersSent, Status status) if (!headersSent) { writeHeadersToServletResponse(trailers); } else { - byte[][] serializedHeaders = TransportFrameUtil.toHttp2Headers(trailers); - for (int i = 0; i < serializedHeaders.length; i += 2) { - String key = new String(serializedHeaders[i], StandardCharsets.US_ASCII); - String newValue = new String(serializedHeaders[i + 1], StandardCharsets.US_ASCII); - trailerSupplier.get().computeIfPresent(key, (k, v) -> v + "," + newValue); - trailerSupplier.get().putIfAbsent(key, newValue); - } + serializeHeaders(trailers, (key, value) -> + trailerSupplier.get().merge(key, value, TrailerSupplier::joinValues)); } writer.complete(); @@ -322,6 +322,10 @@ private static final class TrailerSupplier implements Supplier get() { return trailers; } + + static String joinValues(String oldValue, String newValue) { + return oldValue + "," + newValue; + } } static String toHexString(byte[] bytes, int length) { From 3220a2d18d01419c8cc0d27d2e997288fe4f89ee Mon Sep 17 00:00:00 2001 From: Alex Panchenko <440271+panchenko@users.noreply.github.com> Date: Wed, 20 Aug 2025 15:36:40 +0200 Subject: [PATCH 2/4] inline joinValues() --- .../main/java/io/grpc/servlet/ServletServerStream.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/servlet/src/main/java/io/grpc/servlet/ServletServerStream.java b/servlet/src/main/java/io/grpc/servlet/ServletServerStream.java index 2f9aee80d71..3293da014a6 100644 --- a/servlet/src/main/java/io/grpc/servlet/ServletServerStream.java +++ b/servlet/src/main/java/io/grpc/servlet/ServletServerStream.java @@ -46,6 +46,7 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import java.util.function.BiConsumer; +import java.util.function.BiFunction; import java.util.function.Supplier; import java.util.logging.Logger; import javax.annotation.Nullable; @@ -283,8 +284,8 @@ public void writeTrailers(Metadata trailers, boolean headersSent, Status status) if (!headersSent) { writeHeadersToServletResponse(trailers); } else { - serializeHeaders(trailers, (key, value) -> - trailerSupplier.get().merge(key, value, TrailerSupplier::joinValues)); + BiFunction merge = (oldV, newV) -> oldV + "," + newV; + serializeHeaders(trailers, (key, value) -> trailerSupplier.get().merge(key, value, merge)); } writer.complete(); @@ -322,10 +323,6 @@ private static final class TrailerSupplier implements Supplier get() { return trailers; } - - static String joinValues(String oldValue, String newValue) { - return oldValue + "," + newValue; - } } static String toHexString(byte[] bytes, int length) { From 64af2b9cd5fe379f7113331ad74ac4163b57250c Mon Sep 17 00:00:00 2001 From: Alex Panchenko <440271+panchenko@users.noreply.github.com> Date: Thu, 21 Aug 2025 09:07:24 +0200 Subject: [PATCH 3/4] CR --- .../src/main/java/io/grpc/servlet/ServletServerStream.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/servlet/src/main/java/io/grpc/servlet/ServletServerStream.java b/servlet/src/main/java/io/grpc/servlet/ServletServerStream.java index 3293da014a6..c2778b28709 100644 --- a/servlet/src/main/java/io/grpc/servlet/ServletServerStream.java +++ b/servlet/src/main/java/io/grpc/servlet/ServletServerStream.java @@ -46,7 +46,6 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import java.util.function.BiConsumer; -import java.util.function.BiFunction; import java.util.function.Supplier; import java.util.logging.Logger; import javax.annotation.Nullable; @@ -284,8 +283,9 @@ public void writeTrailers(Metadata trailers, boolean headersSent, Status status) if (!headersSent) { writeHeadersToServletResponse(trailers); } else { - BiFunction merge = (oldV, newV) -> oldV + "," + newV; - serializeHeaders(trailers, (key, value) -> trailerSupplier.get().merge(key, value, merge)); + serializeHeaders(trailers, + (key, value) -> + trailerSupplier.get().merge(key, value, (oldV, newV) -> oldV + "," + newV)); } writer.complete(); From 72ffc132a444d71465814a8e76a4d26c25bc7e5f Mon Sep 17 00:00:00 2001 From: Alex Panchenko <440271+panchenko@users.noreply.github.com> Date: Thu, 21 Aug 2025 09:09:01 +0200 Subject: [PATCH 4/4] CR --- servlet/src/main/java/io/grpc/servlet/ServletServerStream.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/servlet/src/main/java/io/grpc/servlet/ServletServerStream.java b/servlet/src/main/java/io/grpc/servlet/ServletServerStream.java index c2778b28709..e0082df34dd 100644 --- a/servlet/src/main/java/io/grpc/servlet/ServletServerStream.java +++ b/servlet/src/main/java/io/grpc/servlet/ServletServerStream.java @@ -284,8 +284,7 @@ public void writeTrailers(Metadata trailers, boolean headersSent, Status status) writeHeadersToServletResponse(trailers); } else { serializeHeaders(trailers, - (key, value) -> - trailerSupplier.get().merge(key, value, (oldV, newV) -> oldV + "," + newV)); + (k, v) -> trailerSupplier.get().merge(k, v, (oldV, newV) -> oldV + "," + newV)); } writer.complete();