From b865b3ff848fd671f0aef2a5ed8bbb5ba9757041 Mon Sep 17 00:00:00 2001 From: Athou Date: Wed, 14 Oct 2026 07:37:31 +0200 Subject: [PATCH] add support for brotli compression --- commafeed-server/pom.xml | 4 ++++ .../java/com/commafeed/NativeImageClasses.java | 14 +------------- .../com/commafeed/backend/HttpClientFactory.java | 2 ++ .../java/com/commafeed/backend/HttpGetterTest.java | 8 +++++++- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/commafeed-server/pom.xml b/commafeed-server/pom.xml index 63ef07fb..e81a8753 100644 --- a/commafeed-server/pom.xml +++ b/commafeed-server/pom.xml @@ -465,6 +465,10 @@ com.github.luben zstd-jni + + com.aayushatharva.brotli4j + brotli4j + com.github.seancfoley ipaddress diff --git a/commafeed-server/src/main/java/com/commafeed/NativeImageClasses.java b/commafeed-server/src/main/java/com/commafeed/NativeImageClasses.java index 9fba6031..9b5d3fff 100644 --- a/commafeed-server/src/main/java/com/commafeed/NativeImageClasses.java +++ b/commafeed-server/src/main/java/com/commafeed/NativeImageClasses.java @@ -6,8 +6,6 @@ import com.codahale.metrics.Histogram; import com.codahale.metrics.Meter; import com.codahale.metrics.MetricRegistry; import com.codahale.metrics.Timer; -import com.oracle.svm.core.annotate.Substitute; -import com.oracle.svm.core.annotate.TargetClass; import io.quarkus.runtime.annotations.RegisterForReflection; @@ -348,14 +346,4 @@ import io.quarkus.runtime.annotations.RegisterForReflection; com.rometools.opml.feed.synd.impl.ConverterForOPML10.class, com.rometools.opml.feed.synd.impl.ConverterForOPML20.class, }) -public class NativeImageClasses { - - // disable brotli runtime detection because it causes native image failure - @TargetClass(className = "org.apache.hc.client5.http.impl.Brotli4jRuntime") - static final class Brotli4jRuntime { - @Substitute - public static boolean available() { - return false; - } - } -} +public class NativeImageClasses {} diff --git a/commafeed-server/src/main/java/com/commafeed/backend/HttpClientFactory.java b/commafeed-server/src/main/java/com/commafeed/backend/HttpClientFactory.java index cea1dd98..ffedd7bc 100644 --- a/commafeed-server/src/main/java/com/commafeed/backend/HttpClientFactory.java +++ b/commafeed-server/src/main/java/com/commafeed/backend/HttpClientFactory.java @@ -20,6 +20,7 @@ import nl.altindag.ssl.apache5.util.Apache5SslUtils; import org.apache.hc.client5.http.DnsResolver; import org.apache.hc.client5.http.SystemDefaultDnsResolver; import org.apache.hc.client5.http.async.methods.InflatingAsyncDataConsumer; +import org.apache.hc.client5.http.async.methods.InflatingBrotliDataConsumer; import org.apache.hc.client5.http.async.methods.InflatingGzipDataConsumer; import org.apache.hc.client5.http.async.methods.InflatingZstdDataConsumer; import org.apache.hc.client5.http.config.ConnectionConfig; @@ -92,6 +93,7 @@ public class HttpClientFactory { ContentCoding.DEFLATE.token(), d -> new InflatingAsyncDataConsumer(d, null)); contentDecoderMap.put(ContentCoding.GZIP.token(), InflatingGzipDataConsumer::new); contentDecoderMap.put(ContentCoding.ZSTD.token(), InflatingZstdDataConsumer::new); + contentDecoderMap.put(ContentCoding.BROTLI.token(), InflatingBrotliDataConsumer::new); RedirectStrategy redirectStrategy = config.httpClient().blockLocalAddresses() diff --git a/commafeed-server/src/test/java/com/commafeed/backend/HttpGetterTest.java b/commafeed-server/src/test/java/com/commafeed/backend/HttpGetterTest.java index 73c0b207..d3922944 100644 --- a/commafeed-server/src/test/java/com/commafeed/backend/HttpGetterTest.java +++ b/commafeed-server/src/test/java/com/commafeed/backend/HttpGetterTest.java @@ -1,5 +1,6 @@ package com.commafeed.backend; +import com.aayushatharva.brotli4j.encoder.BrotliOutputStream; import com.codahale.metrics.MetricRegistry; import com.commafeed.CommaFeedConfiguration; import com.commafeed.CommaFeedVersion; @@ -418,7 +419,7 @@ class HttpGetterTest { @Nested class Compression { - private static final String ACCEPT_ENCODING = "deflate, gzip, zstd"; + private static final String ACCEPT_ENCODING = "deflate, gzip, zstd, br"; @Test void gzip() throws Exception { @@ -435,6 +436,11 @@ class HttpGetterTest { supportsCompression("zstd", ZstdOutputStream::new); } + @Test + void br() throws Exception { + supportsCompression("br", BrotliOutputStream::new); + } + void supportsCompression(String encoding, CompressionFunction compressionFunction) throws Exception { String body = "my body";