I have configured server.compression.enabled=true for text/html mime types, that are generated with freemarker template. The rest of resources are compressed at built time (vite).

Testing over http works as expected while activating http2 the compression just does not work.

Is this an error or I'm missing something?

imagen

imagen

Comment From: rstoyanchev

Similar to #26056 which is also for http2 and compression but for the client side, I think this is likely an issue for Reactor Netty. @userquin any chance that you can provide a small sample application?

Comment From: userquin

@rstoyanchev I'll try to provide a working sample, it seems to be a problem on the netty configuration, exactly on reactor.netty.http.server.HttpServerConfig::HttpServerChannelInitializer::onChannelInit::799. If you see http entry on this method, the compression predicate is added (http1.1 and/or h2 and/or h2c), while on alone h2 or h2c no. I'll try to add http1.1 and so redirecting to https and see if it works, but I think it will not work.

I think it is a problem how http2 headers must be handled (hpack compression).

else if ((protocols & h2) == h2) {
    configureH2Pipeline(
            channel.pipeline(),
            cookieDecoder,
            cookieEncoder,
            forwardedHeaderHandler,
            http2Settings,
            observer,
            mapHandle,
            opsFactory,
            decoder.validateHeaders());
}

while for exmaple http1.1 entry ():

else if ((protocols & h11) == h11) {
    configureHttp11Pipeline(
            channel.pipeline(),
            compressPredicate(compressPredicate, minCompressionSize), // <==== HERE THE DIFFERENCE
            cookieDecoder,
            cookieEncoder,
            decoder,
            forwardedHeaderHandler,
            observer,
            mapHandle,
            metricsRecorder,
            minCompressionSize,
            uriTagValue);
}

Comment From: rstoyanchev

Okay at this point, might as well re-create the issue in https://github.com/reactor/reactor-netty. I wish I could transfer it but unfortunately it's not possible across organizations.

Comment From: userquin

@rstoyanchev this is a simple project:

spring-framework-issue-26018.zip

Just open it and see application.yml inside resources directory.

To run the app, just run main from SpringFrameworkIssue26018Application.kt: open a browser and enter:

http://localhost:8080/index.html

To serve https (http1.1) you will need to install resources/localhost.crt as a CA or just ignore the errors from the browser and run the app with -Dspring.profiles.active=https or if using IntelliJ, just add https to Active profiles textfield: open a browser and enter:

https://localhost:8443/index.html

To serve https + http2 you will need to install resources/localhost.crt as a CA or just ignore the errors from the browser and run the app with -Dspring.profiles.active=https,http2 or if using IntelliJ, just add https,http2 to Active profiles textfield: open a browser and enter:

https://localhost:8443/index.html

In all cases you will need to open devtools and add Content-Encoding to the table on network entry, I just have no time to create a test unit for it, sorry.

Comment From: userquin

It runs with Java 15 (OpenJDK) and Spring Boot v2.4.0-RC1.

Comment From: violetagg

This seems to be Reactor Netty issue - please create an issue here https://github.com/reactor/reactor-netty/issues

Comment From: userquin

@violetagg https://github.com/reactor/reactor-netty/pull/1381 also solves this issue (using 1.0.2-SNAPSHOT)

imagen