change BrotliOptions to not leaking brotli4j classes

This commit is contained in:
Jörg Prante 2024-01-11 09:30:34 +01:00
parent 5e8af038c8
commit 49b6c772a5
24 changed files with 343 additions and 111 deletions

View file

@ -24,6 +24,7 @@ The following changes were performed on the original source code:
- removed all windows related code
- removed all macos related code (including kqueue)
- removed all aarch64 related code
- removed the direct brotli4j dependency by rewriting Brotli4jOptions to not use Encoder.Parameters
Challenges for Netty build on JDK 21
@ -33,37 +34,38 @@ Challenges for Netty build on JDK 21
--add-opens=jdk.unsupported/sun.misc=ALL-UNNAMED
- finalize() calls in PoolThreadCache, PoolArena are deprecated
- when using boringssl static, setting of SSLContent.useTasks to false makes tests hang. Tests using false setting were removed.
- native code jars with module info
Subproject organization
Original netty subproject names are not related to package names. I reorganized the names to allow better assignment
between subproject name, package name, artifact names, and java module. The following reorgnizations were performed:
all -> [todo]
bom -> [todo]
buffer -> netty-buffer
codec -> netty-handler-codec, netty-handler-codec-compression, netty-handler-codec-protobuf
codec-dns -> [todo]
codec-haproxy -> [todo]
codec-http -> netty-handler-codec-http, netty-handler-codec-rtsp, netty-handler-codec-spdy
codec-http2 ->
codec-memcache ->
codec-mqtt ->
codec-redis ->
codec-smtp ->
codec-socks ->
codec->stomp ->
codec-xml ->
common -> netty-util
handler -> netty-handler
handler-proxy
handler-ssl-ocsp
resolver -> netty-resolver
resolver-dns ->
resolver-dns-classes-macos -> [dropped]
resolver-dns-native-macos -> [dropped]
transport -> netty-channel
transport-classes-epoll -> netty-channel-epoll
transport-native-kqueue -> [dropped]
transport-native-unix-common -> netty-channel-unix
transport-native-unix-common-tests -> netty-channel-unix
netty/all -> [todo]
netty/bom -> [todo]
netty/buffer -> netty-buffer
netty/codec -> netty-handler-codec, netty-handler-codec-compression, netty-handler-codec-protobuf
netty/codec-dns -> [todo]
netty/codec-haproxy -> [todo]
netty/codec-http -> netty-handler-codec-http, netty-handler-codec-rtsp, netty-handler-codec-spdy
netty/codec-http2 ->
netty/codec-memcache ->
netty/codec-mqtt ->
netty/codec-redis ->
netty/codec-smtp ->
netty/codec-socks ->
netty/codec->stomp ->
netty/codec-xml ->
netty/common -> netty-util
netty/handler -> netty-handler
netty/handler-proxy
netty/handler-ssl-ocsp
netty/resolver -> netty-resolver
netty/resolver-dns ->
netty/resolver-dns-classes-macos -> [dropped]
netty/resolver-dns-native-macos -> [dropped]
netty/transport -> netty-channel
netty/transport-classes-epoll -> netty-channel-epoll
netty/transport-native-kqueue -> [dropped]
netty/transport-native-unix-common -> netty-channel-unix
netty/transport-native-unix-common-tests -> netty-channel-unix

View file

@ -3,13 +3,16 @@ plugins {
id 'maven-publish'
id 'signing'
id "io.github.gradle-nexus.publish-plugin" version "2.0.0-rc-1"
id "com.google.osdetector" version "1.7.3"
}
wrapper {
gradleVersion = libs.versions.gradle.get()
distributionType = Wrapper.DistributionType.ALL
distributionType = Wrapper.DistributionType.BIN
}
apply plugin: 'com.google.osdetector'
ext {
user = 'joerg'
name = 'netty'
@ -23,6 +26,8 @@ ext {
issueManagementUrl = ext.scmUrl + '/issues'
licenseName = 'The Apache License, Version 2.0'
licenseUrl = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
organizationName = 'xbib'
organizationUrl = 'https://xbib.org'
}
subprojects {

View file

@ -30,7 +30,10 @@ test {
'--add-opens=jdk.unsupported/sun.misc=ALL-UNNAMED',
'-Dio.netty.bootstrap.extensions=serviceload'
systemProperty 'java.util.logging.config.file', 'src/test/resources/logging.properties'
// we have remove native images, this is no longer used
systemProperty "nativeImage.handlerMetadataGroupId", "io.netty"
// we have remove native images
// we have remove native images, this is no longer used
systemProperty "nativeimage.handlerMetadataArtifactId", "netty-transport"
afterSuite { desc, result ->
if (!desc.parent) {

View file

@ -1,3 +1,6 @@
apply plugin: 'com.google.osdetector'
dependencies {
api project(':netty-handler-codec')
implementation project(':netty-bzip2')
@ -6,11 +9,7 @@ dependencies {
implementation libs.lz4
implementation libs.lzf
implementation libs.zstd
runtimeOnly libs.brotli4j.native."${osdetector.os}"."${osdetector.arch.replace('_','')}"
testImplementation testLibs.commons.compress
testImplementation testLibs.mockito.core
testRuntimeOnly testLibs.brotli4j.native.linux.x8664
testRuntimeOnly testLibs.brotli4j.native.linux.aarch64
testRuntimeOnly testLibs.brotli4j.native.osx.x8664
testRuntimeOnly testLibs.brotli4j.native.osx.aarch64
testRuntimeOnly testLibs.brotli4j.native.windows.x8664
}

View file

@ -27,12 +27,12 @@ import io.netty.channel.ChannelPromise;
import io.netty.handler.codec.MessageToByteEncoder;
import io.netty.util.AttributeKey;
import io.netty.util.ReferenceCountUtil;
import io.netty.util.internal.ObjectUtil;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.ClosedChannelException;
import java.nio.channels.WritableByteChannel;
import java.util.Locale;
/**
* Compress a {@link ByteBuf} with the Brotli compression.
@ -44,8 +44,10 @@ public final class BrotliEncoder extends MessageToByteEncoder<ByteBuf> {
private static final AttributeKey<Writer> ATTR = AttributeKey.valueOf("BrotliEncoderWriter");
private final Encoder.Parameters parameters;
private final BrotliOptions brotliOptions;
private final boolean isSharable;
private Writer writer;
/**
@ -53,7 +55,7 @@ public final class BrotliEncoder extends MessageToByteEncoder<ByteBuf> {
* and {@link #isSharable()} set to {@code true}
*/
public BrotliEncoder() {
this(BrotliOptions.DEFAULT);
this(BrotliOptions.DEFAULT, true);
}
/**
@ -63,17 +65,7 @@ public final class BrotliEncoder extends MessageToByteEncoder<ByteBuf> {
* {@link #isSharable()} set to {@code true}
*/
public BrotliEncoder(BrotliOptions brotliOptions) {
this(brotliOptions.parameters());
}
/**
* Create a new {@link BrotliEncoder} Instance
* and {@link #isSharable()} set to {@code true}
*
* @param parameters {@link Encoder.Parameters} to use
*/
public BrotliEncoder(Encoder.Parameters parameters) {
this(parameters, true);
this(brotliOptions, true);
}
/**
@ -89,17 +81,16 @@ public final class BrotliEncoder extends MessageToByteEncoder<ByteBuf> {
* with the appropriate channel. And this will add a overhead. So it is recommended to set {@link #isSharable()}
* to {@code false} and create new {@link BrotliEncoder} instance for every pipeline.
*
* @param parameters {@link Encoder.Parameters} to use
* @param isSharable Set to {@code true} if this instance is shared else set to {@code false}
*/
public BrotliEncoder(Encoder.Parameters parameters, boolean isSharable) {
this.parameters = ObjectUtil.checkNotNull(parameters, "Parameters");
public BrotliEncoder(BrotliOptions brotliOptions, boolean isSharable) {
this.brotliOptions = brotliOptions;
this.isSharable = isSharable;
}
@Override
public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
Writer writer = new Writer(parameters, ctx);
Writer writer = new Writer(brotliOptions, ctx);
if (isSharable) {
ctx.channel().attr(ATTR).set(writer);
} else {
@ -189,7 +180,11 @@ public final class BrotliEncoder extends MessageToByteEncoder<ByteBuf> {
private final ChannelHandlerContext ctx;
private boolean isClosed;
private Writer(Encoder.Parameters parameters, ChannelHandlerContext ctx) throws IOException {
private Writer(BrotliOptions brotliOptions, ChannelHandlerContext ctx) throws IOException {
Encoder.Parameters parameters = new Encoder.Parameters()
.setMode(Encoder.Mode.valueOf(brotliOptions.getMode().toUpperCase(Locale.ROOT)))
.setQuality(brotliOptions.getQuality())
.setWindow(brotliOptions.getWindow());
brotliEncoderChannel = new BrotliEncoderChannel(this, parameters);
this.ctx = ctx;
}
@ -242,14 +237,11 @@ public final class BrotliEncoder extends MessageToByteEncoder<ByteBuf> {
public void close() {
final ChannelPromise promise = ctx.newPromise();
ctx.executor().execute(new Runnable() {
@Override
public void run() {
try {
finish(promise);
} catch (IOException ex) {
promise.setFailure(new IllegalStateException("Failed to finish encoding", ex));
}
ctx.executor().execute(() -> {
try {
finish(promise);
} catch (IOException ex) {
promise.setFailure(new IllegalStateException("Failed to finish encoding", ex));
}
});
}

View file

@ -15,33 +15,43 @@
*/
package io.netty.handler.codec.compression;
import com.aayushatharva.brotli4j.encoder.Encoder;
import io.netty.util.internal.ObjectUtil;
import java.util.Objects;
/**
* {@link BrotliOptions} holds {@link Encoder.Parameters} for
* {@link BrotliOptions} holds configuration options for
* Brotli compression.
*/
public final class BrotliOptions implements CompressionOptions {
private final Encoder.Parameters parameters;
private final String mode;
private final int quality;
private final int window;
/**
* @see StandardCompressionOptions#brotli()
*/
static final BrotliOptions DEFAULT = new BrotliOptions(
new Encoder.Parameters().setQuality(4).setMode(Encoder.Mode.TEXT)
);
static final BrotliOptions DEFAULT = new BrotliOptions("text", 4, -1);
BrotliOptions(Encoder.Parameters parameters) {
BrotliOptions(String mode, int quality, int window) {
if (!Brotli.isAvailable()) {
throw new IllegalStateException("Brotli is not available", Brotli.cause());
}
this.parameters = ObjectUtil.checkNotNull(parameters, "Parameters");
this.mode = Objects.requireNonNull(mode);
this.quality = quality;
this.window = window;
}
public Encoder.Parameters parameters() {
return parameters;
public String getMode() {
return mode;
}
public int getQuality() {
return quality;
}
public int getWindow() {
return window;
}
}

View file

@ -30,6 +30,7 @@ public final class StandardCompressionOptions {
/**
* Default implementation of {@link BrotliOptions} with {@link Encoder.Parameters#setQuality(int)} set to 4
* and {@link Encoder.Parameters#setMode(Encoder.Mode)} set to {@link Encoder.Mode#TEXT}
* and {@link Encoder.Parameters#setWindow(int)}} set to -1
*/
public static BrotliOptions brotli() {
return BrotliOptions.DEFAULT;
@ -38,11 +39,10 @@ public final class StandardCompressionOptions {
/**
* Create a new {@link BrotliOptions}
*
* @param parameters {@link Encoder.Parameters} Instance
* @throws NullPointerException If {@link Encoder.Parameters} is {@code null}
*/
public static BrotliOptions brotli(Encoder.Parameters parameters) {
return new BrotliOptions(parameters);
public static BrotliOptions brotli(String mode, int quality, int window) {
return new BrotliOptions(mode, quality, window);
}
/**

View file

@ -3,12 +3,8 @@ dependencies {
api project(':netty-handler-ssl')
api project(':netty-handler-codec-compression')
implementation project(':netty-zlib')
implementation libs.brotli4j // accessing com.aayushatharva.brotli4j.encoder.Encoder
testImplementation libs.brotli4j
testImplementation testLibs.assertj
testImplementation testLibs.mockito.core
testRuntimeOnly testLibs.brotli4j.native.linux.x8664
testRuntimeOnly testLibs.brotli4j.native.linux.aarch64
testRuntimeOnly testLibs.brotli4j.native.osx.x8664
testRuntimeOnly testLibs.brotli4j.native.osx.aarch64
testRuntimeOnly testLibs.brotli4j.native.windows.x8664
testRuntimeOnly libs.brotli4j.native."${osdetector.os}"."${osdetector.arch.replace('_','')}"
}

View file

@ -444,7 +444,7 @@ public class HttpContentCompressor extends HttpContentEncoder {
@Override
public MessageToByteEncoder<ByteBuf> createEncoder() {
return new BrotliEncoder(brotliOptions.parameters());
return new BrotliEncoder(brotliOptions);
}
}

View file

@ -13,6 +13,5 @@ module org.xbib.io.netty.handler.codec.http {
requires org.xbib.io.netty.handler.ssl;
requires org.xbib.io.netty.util;
requires org.xbib.io.netty.zlib;
requires com.aayushatharva.brotli4j;
//requires com.aayushatharva.brotli4j;
}

View file

@ -1,15 +1,8 @@
dependencies {
api project(':netty-handler-codec-http')
implementation libs.brotli4j // accessing com.aayushatharva.brotli4j.encoder.Encoder
testImplementation testLibs.gson
testImplementation testLibs.assertj
testImplementation testLibs.mockito.core
testRuntimeOnly(variantOf(testLibs.netty.tcnative.boringssl.static) {
classifier('linux-x86_64')
})
testRuntimeOnly testLibs.brotli4j.native.linux.x8664
testRuntimeOnly testLibs.brotli4j.native.linux.aarch64
testRuntimeOnly testLibs.brotli4j.native.osx.x8664
testRuntimeOnly testLibs.brotli4j.native.osx.aarch64
testRuntimeOnly testLibs.brotli4j.native.windows.x8664
testRuntimeOnly project(path: ':netty-tcnative-boringssl-static', configuration: osdetector.classifier)
testRuntimeOnly libs.brotli4j.native."${osdetector.os}"."${osdetector.arch.replace('_','')}"
}

View file

@ -87,10 +87,14 @@ public class CompressorHttp2ConnectionEncoder extends DecoratingHttp2ConnectionE
StandardCompressionOptions.brotli(),
StandardCompressionOptions.snappy(),
StandardCompressionOptions.gzip(),
StandardCompressionOptions.deflate() };
StandardCompressionOptions.deflate()
};
}
return new CompressionOptions[] { StandardCompressionOptions.snappy(),
StandardCompressionOptions.gzip(), StandardCompressionOptions.deflate() };
return new CompressionOptions[] {
StandardCompressionOptions.snappy(),
StandardCompressionOptions.gzip(),
StandardCompressionOptions.deflate()
};
}
/**
@ -284,7 +288,7 @@ public class CompressorHttp2ConnectionEncoder extends DecoratingHttp2ConnectionE
}
if (Brotli.isAvailable() && brotliOptions != null && BR.contentEqualsIgnoreCase(contentEncoding)) {
return new EmbeddedChannel(ctx.channel().id(), ctx.channel().metadata().hasDisconnect(),
ctx.channel().config(), new BrotliEncoder(brotliOptions.parameters()));
ctx.channel().config(), new BrotliEncoder(brotliOptions));
}
if (zstdOptions != null && ZSTD.contentEqualsIgnoreCase(contentEncoding)) {
return new EmbeddedChannel(ctx.channel().id(), ctx.channel().metadata().hasDisconnect(),

View file

@ -8,5 +8,4 @@ module org.xbib.io.netty.handler.codec.httptwo {
requires org.xbib.io.netty.handler.codec.http;
requires org.xbib.io.netty.handler.ssl;
requires org.xbib.io.netty.util;
requires com.aayushatharva.brotli4j;
}

View file

@ -0,0 +1,70 @@
task nettyQuicLinuxX8664(type: Jar) {
archiveBaseName.set('netty-handler-codec-quic-native')
archiveClassifier.set('linux-x86_64')
version rootProject.version
from (sourceSets.main.output) {
include 'META-INF/native/libnetty_quiche_linux_x86_64.so'
}
}
assemble.dependsOn(nettyQuicLinuxX8664)
configurations {
'linux-x86_64' {
canBeConsumed = true
canBeResolved = false
extendsFrom runtimeOnly
}
}
artifacts {
'linux-x86_64'(nettyQuicLinuxX8664)
}
publishing {
publications {
publishNettyQuicLinuxX8664(MavenPublication) {
groupId rootProject.group
artifactId project.name
version rootProject.version
artifact nettyQuicLinuxX8664
pom {
artifactId = project.name
name = project.name
version = project.version
description = rootProject.ext.description
url = rootProject.ext.url
inceptionYear = rootProject.ext.inceptionYear
packaging = 'jar'
organization {
name = rootProject.ext.organizationName
url = rootProject.ext.organizationUrl
}
developers {
developer {
id = 'jprante'
name = 'Jörg Prante'
email = 'joergprante@gmail.com'
url = 'https://xbib.org/joerg'
}
}
scm {
url = rootProject.ext.scmUrl
connection = rootProject.ext.scmConnection
developerConnection = rootProject.ext.scmDeveloperConnection
}
issueManagement {
system = rootProject.ext.issueManagementSystem
url = rootProject.ext.issueManagementUrl
}
licenses {
license {
name = rootProject.ext.licenseName
url = rootProject.ext.licenseUrl
distribution = 'repo'
}
}
}
}
}
}

View file

@ -2,4 +2,5 @@ dependencies {
api project(':netty-handler-ssl')
implementation project(':netty-channel-epoll')
implementation project(':netty-channel-unix')
runtimeOnly project(path: ':netty-handler-codec-quic-native', configuration: osdetector.classifier)
}

View file

@ -1,3 +1,6 @@
apply plugin: 'com.google.osdetector'
dependencies {
api project(':netty-handler-codec')
api project(':netty-internal-tcnative')
@ -9,10 +12,8 @@ dependencies {
testImplementation project(':netty-handler')
testImplementation (testLibs.amazonCorrettoCrypt) {
artifact {
classifier = 'linux-x86_64'
classifier = osdetector.classifier
}
}
testRuntimeOnly(variantOf(testLibs.netty.tcnative.boringssl.static) {
classifier('linux-x86_64')
})
testRuntimeOnly project(path: ':netty-tcnative-boringssl-static', configuration: osdetector.classifier)
}

View file

@ -0,0 +1,158 @@
task nettyTcNativeBoringSslStaticLinuxX8664(type: Jar) {
archiveBaseName.set('netty-tcnative-boringssl-static')
archiveClassifier.set('linux-x86_64')
version rootProject.version
from (sourceSets.main.output) {
include 'META-INF/native/libnetty_tcnative_linux_x86_64.so'
}
}
assemble.dependsOn(nettyTcNativeBoringSslStaticLinuxX8664)
task nettyTcNativeBoringSslStaticLinuxAarch64(type: Jar) {
archiveBaseName.set('netty-tcnative-boringssl-static')
archiveClassifier.set('linux-aarch_64')
version rootProject.version
from (sourceSets.main.output) {
include 'META-INF/native/libnetty_tcnative_linux_aarch_64.so'
}
}
assemble.dependsOn(nettyTcNativeBoringSslStaticLinuxAarch64)
task nettyTcNativeBoringSslStaticOsxX8664(type: Jar) {
archiveBaseName.set('netty-tcnative-boringssl-static')
archiveClassifier.set('osx-x86_64')
version rootProject.version
from (sourceSets.main.output) {
include 'META-INF/native/libnetty_tcnative_osx_x86_64.jnilib'
}
}
assemble.dependsOn(nettyTcNativeBoringSslStaticOsxX8664)
task nettyTcNativeBoringSslStaticOsxAarch64(type: Jar) {
archiveBaseName.set('netty-tcnative-boringssl-static')
archiveClassifier.set('osx-aarch_64')
version rootProject.version
from (sourceSets.main.output) {
include 'META-INF/native/libnetty_tcnative_osx_aarch_64.jnilib'
}
}
assemble.dependsOn(nettyTcNativeBoringSslStaticOsxAarch64)
task nettyTcNativeBoringSslStaticWindowsX8664(type: Jar) {
archiveBaseName.set('netty-tcnative-boringssl-static')
archiveClassifier.set('windows-x86_64')
version rootProject.version
from (sourceSets.main.output) {
include 'META-INF/native/libnetty_tcnative_windows_x86_64.dll'
}
}
assemble.dependsOn(nettyTcNativeBoringSslStaticWindowsX8664)
configurations {
'linux-x86_64' {
canBeConsumed = true
canBeResolved = false
extendsFrom runtimeOnly
}
'linux-aarch64' {
canBeConsumed = true
canBeResolved = false
extendsFrom runtimeOnly
}
'osx-x86_64' {
canBeConsumed = true
canBeResolved = false
extendsFrom runtimeOnly
}
'osx-aarch64' {
canBeConsumed = true
canBeResolved = false
extendsFrom runtimeOnly
}
'windows-x86_64' {
canBeConsumed = true
canBeResolved = false
extendsFrom runtimeOnly
}
}
artifacts {
'linux-x86_64'(nettyTcNativeBoringSslStaticLinuxX8664)
'linux-aarch64'(nettyTcNativeBoringSslStaticLinuxAarch64)
'osx-x86_64'(nettyTcNativeBoringSslStaticOsxX8664)
'osx-aarch64'(nettyTcNativeBoringSslStaticOsxAarch64)
'windows-x86_64'(nettyTcNativeBoringSslStaticWindowsX8664)
}
publishing {
publications {
publishNettyTcNaticeBoringSslStaticLinuxX8664(MavenPublication) {
groupId rootProject.group
artifactId project.name
version rootProject.version
artifact nettyTcNativeBoringSslStaticLinuxX8664
pom {
artifactId = project.name
name = project.name
version = project.version
description = rootProject.ext.description
url = rootProject.ext.url
inceptionYear = rootProject.ext.inceptionYear
packaging = 'jar'
organization {
name = rootProject.ext.organizationName
url = rootProject.ext.organizationUrl
}
developers {
developer {
id = 'jprante'
name = 'Jörg Prante'
email = 'joergprante@gmail.com'
url = 'https://xbib.org/joerg'
}
}
scm {
url = rootProject.ext.scmUrl
connection = rootProject.ext.scmConnection
developerConnection = rootProject.ext.scmDeveloperConnection
}
issueManagement {
system = rootProject.ext.issueManagementSystem
url = rootProject.ext.issueManagementUrl
}
licenses {
license {
name = rootProject.ext.licenseName
url = rootProject.ext.licenseUrl
distribution = 'repo'
}
}
}
}
publishNettyTcNativeBoringSslStaticLinuxAarch64(MavenPublication) {
groupId rootProject.group
artifactId project.name
version rootProject.version
artifact nettyTcNativeBoringSslStaticLinuxAarch64
}
publishNettyTcNaticeBoringSslStaticOsxX8664(MavenPublication) {
groupId rootProject.group
artifactId project.name
version rootProject.version
artifact nettyTcNativeBoringSslStaticOsxX8664
}
publishNettyTcNativeBoringSslStaticOsxAarch64(MavenPublication) {
groupId rootProject.group
artifactId project.name
version rootProject.version
artifact nettyTcNativeBoringSslStaticOsxAarch64
}
publishNettyTcNaticeBoringSslStaticWindowsX8664(MavenPublication) {
groupId rootProject.group
artifactId project.name
version rootProject.version
artifact nettyTcNativeBoringSslStaticWindowsX8664
}
}
}

View file

@ -24,10 +24,15 @@ dependencyResolutionManagement {
library('lzf', 'com.ning', 'compress-lzf').version('1.1.2')
library('zstd', 'com.github.luben', 'zstd-jni').version('1.5.5-11')
library('protobuf', 'com.google.protobuf', 'protobuf-java').version('4.0.0-rc-2')
library('brotli4j-native-linux-x8664', 'com.aayushatharva.brotli4j', 'native-linux-x86_64').versionRef('brotli4j')
library('brotli4j-native-linux-aarch64', 'com.aayushatharva.brotli4j', 'native-linux-aarch64').versionRef('brotli4j')
library('brotli4j-native-linux-riscv64', 'com.aayushatharva.brotli4j', 'native-linux-riscv64').versionRef('brotli4j')
library('brotli4j-native-osx-x8664', 'com.aayushatharva.brotli4j', 'native-osx-x86_64').versionRef('brotli4j')
library('brotli4j-native-osx-aarch64', 'com.aayushatharva.brotli4j', 'native-osx-aarch64').versionRef('brotli4j')
library('brotli4j-native-windows-x8664', 'com.aayushatharva.brotli4j', 'native-windows-x86_64').versionRef('brotli4j')
}
testLibs {
version('junit', '5.10.1')
version('brotli4j', '1.15.0')
library('junit-jupiter-api', 'org.junit.jupiter', 'junit-jupiter-api').versionRef('junit')
library('junit-jupiter-params', 'org.junit.jupiter', 'junit-jupiter-params').versionRef('junit')
library('junit-jupiter-engine', 'org.junit.jupiter', 'junit-jupiter-engine').versionRef('junit')
@ -45,13 +50,6 @@ dependencyResolutionManagement {
library('reflections', 'org.reflections', 'reflections').version('0.10.2')
library('amazonCorrettoCrypt', 'software.amazon.cryptools', 'AmazonCorrettoCryptoProvider').version('2.3.2')
library('commons-compress', 'org.apache.commons', 'commons-compress').version('1.25.0')
library('brotli4j-native-linux-x8664', 'com.aayushatharva.brotli4j', 'native-linux-x86_64').versionRef('brotli4j')
library('brotli4j-native-linux-aarch64', 'com.aayushatharva.brotli4j', 'native-linux-aarch64').versionRef('brotli4j')
library('brotli4j-native-linux-riscv64', 'com.aayushatharva.brotli4j', 'native-linux-riscv64').versionRef('brotli4j')
library('brotli4j-native-osx-x8664', 'com.aayushatharva.brotli4j', 'native-osx-x86_64').versionRef('brotli4j')
library('brotli4j-native-osx-aarch64', 'com.aayushatharva.brotli4j', 'native-osx-aarch64').versionRef('brotli4j')
library('brotli4j-native-windows-x8664', 'com.aayushatharva.brotli4j', 'native-windows-x86_64').versionRef('brotli4j')
library('netty.tcnative.boringssl.static', 'io.netty', 'netty-tcnative-boringssl-static').version('2.0.62.Final')
}
}
}
@ -69,11 +67,13 @@ include 'netty-handler-codec-http2'
include 'netty-handler-codec-http3'
include 'netty-handler-codec-protobuf'
include 'netty-handler-codec-quic'
include 'netty-handler-codec-quic-native'
include 'netty-handler-codec-rtsp'
include 'netty-handler-codec-spdy'
include 'netty-handler-ssl'
include 'netty-internal-tcnative'
include 'netty-jctools'
include 'netty-resolver'
include 'netty-tcnative-boringssl-static'
include 'netty-util'
include 'netty-zlib'