Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit bea1086

Browse files
committedApr 15, 2024
support zstd compression
1 parent 9a31ce5 commit bea1086

File tree

4 files changed

+40
-0
lines changed

4 files changed

+40
-0
lines changed
 

‎client/src/main/java/org/asynchttpclient/netty/request/NettyRequestFactory.java

+10
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import io.netty.buffer.ByteBuf;
1919
import io.netty.buffer.Unpooled;
2020
import io.netty.handler.codec.compression.Brotli;
21+
import io.netty.handler.codec.compression.Zstd;
2122
import io.netty.handler.codec.http.DefaultFullHttpRequest;
2223
import io.netty.handler.codec.http.DefaultHttpRequest;
2324
import io.netty.handler.codec.http.HttpHeaderValues;
@@ -67,6 +68,7 @@
6768
import static org.asynchttpclient.util.HttpUtils.ACCEPT_ALL_HEADER_VALUE;
6869
import static org.asynchttpclient.util.HttpUtils.GZIP_DEFLATE;
6970
import static org.asynchttpclient.util.HttpUtils.filterOutBrotliFromAcceptEncoding;
71+
import static org.asynchttpclient.util.HttpUtils.filterOutZstdFromAcceptEncoding;
7072
import static org.asynchttpclient.util.HttpUtils.hostHeader;
7173
import static org.asynchttpclient.util.HttpUtils.originHeader;
7274
import static org.asynchttpclient.util.HttpUtils.urlEncodeFormParams;
@@ -182,13 +184,21 @@ public NettyRequest newNettyRequest(Request request, boolean performConnectReque
182184
// For manual decompression by user, any encoding may suite, so leave untouched
183185
headers.set(ACCEPT_ENCODING, filterOutBrotliFromAcceptEncoding(userDefinedAcceptEncoding));
184186
}
187+
if (!Zstd.isAvailable()) {
188+
// zstd is not available.
189+
// For manual decompression by user, any encoding may suit, so leave untouched
190+
headers.set(ACCEPT_ENCODING, filterOutZstdFromAcceptEncoding(userDefinedAcceptEncoding));
191+
}
185192
}
186193
} else if (config.isCompressionEnforced()) {
187194
// Add Accept Encoding header if compression is enforced
188195
headers.set(ACCEPT_ENCODING, GZIP_DEFLATE);
189196
if (Brotli.isAvailable()) {
190197
headers.add(ACCEPT_ENCODING, HttpHeaderValues.BR);
191198
}
199+
if (Zstd.isAvailable()) {
200+
headers.add(ACCEPT_ENCODING, HttpHeaderValues.ZSTD);
201+
}
192202
}
193203
}
194204

‎client/src/main/java/org/asynchttpclient/util/HttpUtils.java

+9
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ public final class HttpUtils {
4040
private static final String CONTENT_TYPE_CHARSET_ATTRIBUTE = "charset=";
4141
private static final String CONTENT_TYPE_BOUNDARY_ATTRIBUTE = "boundary=";
4242
private static final String BROTLY_ACCEPT_ENCODING_SUFFIX = ", br";
43+
private static final String ZSTD_ACCEPT_ENCODING_SUFFIX = ", zstd";
4344

4445
private HttpUtils() {
4546
// Prevent outside initialization
@@ -173,4 +174,12 @@ public static CharSequence filterOutBrotliFromAcceptEncoding(String acceptEncodi
173174
}
174175
return acceptEncoding;
175176
}
177+
178+
public static CharSequence filterOutZstdFromAcceptEncoding(String acceptEncoding) {
179+
// we don't support zstd ATM
180+
if (acceptEncoding.endsWith(ZSTD_ACCEPT_ENCODING_SUFFIX)) {
181+
return acceptEncoding.subSequence(0, acceptEncoding.length() - ZSTD_ACCEPT_ENCODING_SUFFIX.length());
182+
}
183+
return acceptEncoding;
184+
}
176185
}

‎client/src/test/java/org/asynchttpclient/netty/NettyTest.java

+13
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import io.netty.channel.epoll.Epoll;
44
import io.netty.channel.kqueue.KQueue;
55
import io.netty.handler.codec.compression.Brotli;
6+
import io.netty.handler.codec.compression.Zstd;
67
import io.netty.incubator.channel.uring.IOUring;
78
import org.junit.jupiter.api.Test;
89
import org.junit.jupiter.api.condition.EnabledOnOs;
@@ -40,4 +41,16 @@ public void brotliIsAvailableOnLinux() {
4041
public void brotliIsAvailableOnMac() {
4142
assertTrue(Brotli.isAvailable());
4243
}
44+
45+
@Test
46+
@EnabledOnOs(value = OS.LINUX)
47+
public void zstdIsAvailableOnLinux() {
48+
assertTrue(Zstd.isAvailable());
49+
}
50+
51+
@Test
52+
@EnabledOnOs(value = OS.MAC)
53+
public void zstdIsAvailableOnMac() {
54+
assertTrue(Zstd.isAvailable());
55+
}
4356
}

‎pom.xml

+8
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@
6161
<netty.version>4.1.109.Final</netty.version>
6262
<netty.iouring>0.0.25.Final</netty.iouring>
6363
<brotli4j.version>1.16.0</brotli4j.version>
64+
<zstd-jni.version>1.5.6-1</zstd-jni.version>
6465
<slf4j.version>2.0.13</slf4j.version>
6566
<activation.version>2.0.1</activation.version>
6667
<logback.version>1.4.11</logback.version>
@@ -224,6 +225,13 @@
224225
<optional>true</optional>
225226
</dependency>
226227

228+
<dependency>
229+
<groupId>com.github.luben</groupId>
230+
<artifactId>zstd-jni</artifactId>
231+
<version>${zstd-jni.version}</version>
232+
<optional>true</optional>
233+
</dependency>
234+
227235
<dependency>
228236
<groupId>com.aayushatharva.brotli4j</groupId>
229237
<artifactId>brotli4j</artifactId>

0 commit comments

Comments
 (0)
Please sign in to comment.