From f2891bfe8ef3e0a75ed2cc1501a960367e597f39 Mon Sep 17 00:00:00 2001 From: Alexander Golovlev Date: Tue, 14 Oct 2025 21:06:52 +0300 Subject: [PATCH 1/2] Enable more HTTP decompression methods for remote cache --- .../lib/remote/http/HttpDownloadHandler.java | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/google/devtools/build/lib/remote/http/HttpDownloadHandler.java b/src/main/java/com/google/devtools/build/lib/remote/http/HttpDownloadHandler.java index 561329fd2ef4e7..5c9d068bbe84d0 100644 --- a/src/main/java/com/google/devtools/build/lib/remote/http/HttpDownloadHandler.java +++ b/src/main/java/com/google/devtools/build/lib/remote/http/HttpDownloadHandler.java @@ -20,6 +20,8 @@ import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelPromise; +import io.netty.handler.codec.compression.Brotli; +import io.netty.handler.codec.compression.Zstd; import io.netty.handler.codec.http.DefaultFullHttpRequest; import io.netty.handler.codec.http.HttpContent; import io.netty.handler.codec.http.HttpHeaderNames; @@ -42,6 +44,19 @@ /** ChannelHandler for downloads. */ final class HttpDownloadHandler extends AbstractHttpHandler { + private static final String ACCEPT_ENCODING; + static { + StringBuilder acceptEncoding = new StringBuilder(HttpHeaderValues.GZIP); + acceptEncoding.append(",").append(HttpHeaderValues.DEFLATE).append(",").append(HttpHeaderValues.SNAPPY); + if (Brotli.isAvailable()) { + acceptEncoding.append(",").append(HttpHeaderValues.BR); + } + if (Zstd.isAvailable()) { + acceptEncoding.append(",").append(HttpHeaderValues.ZSTD); + } + ACCEPT_ENCODING = acceptEncoding.toString(); + } + private OutputStream out; private boolean keepAlive = HttpVersion.HTTP_1_1.isKeepAliveDefault(); private boolean downloadSucceeded; @@ -180,7 +195,7 @@ private HttpRequest buildRequest(String path, String host) { httpRequest.headers().set(HttpHeaderNames.HOST, host); httpRequest.headers().set(HttpHeaderNames.CONNECTION, HttpHeaderValues.KEEP_ALIVE); httpRequest.headers().set(HttpHeaderNames.ACCEPT, "*/*"); - httpRequest.headers().set(HttpHeaderNames.ACCEPT_ENCODING, HttpHeaderValues.GZIP); + httpRequest.headers().set(HttpHeaderNames.ACCEPT_ENCODING, ACCEPT_ENCODING); return httpRequest; } From 7603fc3741e248ed4b1ba34031eeb1ffca4e5258 Mon Sep 17 00:00:00 2001 From: Alexander Golovlev Date: Fri, 17 Oct 2025 16:27:48 +0300 Subject: [PATCH 2/2] Extracted into static helper function --- .../lib/remote/http/HttpDownloadHandler.java | 28 +++++++++++-------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/google/devtools/build/lib/remote/http/HttpDownloadHandler.java b/src/main/java/com/google/devtools/build/lib/remote/http/HttpDownloadHandler.java index 5c9d068bbe84d0..08d5e3d38ba2ed 100644 --- a/src/main/java/com/google/devtools/build/lib/remote/http/HttpDownloadHandler.java +++ b/src/main/java/com/google/devtools/build/lib/remote/http/HttpDownloadHandler.java @@ -16,7 +16,9 @@ import static com.google.common.base.Preconditions.checkState; import com.google.auth.Credentials; +import com.google.common.base.Joiner; import com.google.common.collect.ImmutableList; +import com.google.common.collect.Lists; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelPromise; @@ -35,27 +37,18 @@ import io.netty.handler.codec.http.HttpVersion; import io.netty.handler.codec.http.LastHttpContent; import io.netty.handler.timeout.ReadTimeoutException; +import io.netty.util.AsciiString; import io.netty.util.internal.StringUtil; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; +import java.util.ArrayList; import java.util.Map.Entry; /** ChannelHandler for downloads. */ final class HttpDownloadHandler extends AbstractHttpHandler { - private static final String ACCEPT_ENCODING; - static { - StringBuilder acceptEncoding = new StringBuilder(HttpHeaderValues.GZIP); - acceptEncoding.append(",").append(HttpHeaderValues.DEFLATE).append(",").append(HttpHeaderValues.SNAPPY); - if (Brotli.isAvailable()) { - acceptEncoding.append(",").append(HttpHeaderValues.BR); - } - if (Zstd.isAvailable()) { - acceptEncoding.append(",").append(HttpHeaderValues.ZSTD); - } - ACCEPT_ENCODING = acceptEncoding.toString(); - } + private static final String ACCEPT_ENCODING = getAcceptEncoding(); private OutputStream out; private boolean keepAlive = HttpVersion.HTTP_1_1.isKeepAliveDefault(); @@ -247,4 +240,15 @@ private void reset(ChannelHandlerContext ctx) { response = null; } } + + private static String getAcceptEncoding() { + ArrayList acceptEncoding = Lists.newArrayList(HttpHeaderValues.GZIP, HttpHeaderValues.DEFLATE, HttpHeaderValues.SNAPPY); + if (Brotli.isAvailable()) { + acceptEncoding.add(HttpHeaderValues.BR); + } + if (Zstd.isAvailable()) { + acceptEncoding.add(HttpHeaderValues.ZSTD); + } + return Joiner.on(",").join(acceptEncoding); + } }