Skip to content

Commit 5cb4599

Browse files
authored
Apply request-decompression-enabled config to HTTP/2 (#12334)
1 parent 0e397c7 commit 5cb4599

3 files changed

Lines changed: 31 additions & 12 deletions

File tree

http-server-netty/src/main/java/io/micronaut/http/server/netty/HttpPipelineBuilder.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -474,6 +474,7 @@ private Http2FrameCodec createHttp2FrameCodec() {
474474

475475
private Http2ConnectionHandler createHttp2ServerHandler(boolean ssl) {
476476
Http2ServerHandler.ConnectionHandlerBuilder builder = new Http2ServerHandler.ConnectionHandlerBuilder(makeRequestHandler(embeddedServices.getWebSocketUpgradeHandler(server), ssl))
477+
.decompress(server.getServerConfiguration().isRequestDecompressionEnabled())
477478
.compressor(embeddedServices.getHttpCompressionStrategy())
478479
.bodySizeLimits(bodySizeLimits())
479480
.accessLogManagerFactory(accessLogManagerFactory)

http-server-netty/src/main/java/io/micronaut/http/server/netty/handler/Http2ServerHandler.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,7 @@ public static final class ConnectionHandlerBuilder extends AbstractHttp2Connecti
289289
private final Http2ServerHandler frameListener;
290290
private Http2AccessLogManager.Factory accessLogManagerFactory;
291291
private Http2AccessLogManager accessLogManager;
292+
private boolean decompress = true;
292293

293294
public ConnectionHandlerBuilder(RequestHandler requestHandler) {
294295
frameListener = new Http2ServerHandler(requestHandler);
@@ -326,10 +327,15 @@ public ConnectionHandlerBuilder bodySizeLimits(BodySizeLimits bodySizeLimits) {
326327
return this;
327328
}
328329

330+
public ConnectionHandlerBuilder decompress(boolean decompress) {
331+
this.decompress = decompress;
332+
return this;
333+
}
334+
329335
@Override
330336
public ConnectionHandler build() {
331337
connection(new DefaultHttp2Connection(isServer(), maxReservedStreams()));
332-
Http2FrameListener fl = new DelegatingDecompressorFrameListener(connection(), frameListener, false);
338+
Http2FrameListener fl = decompress ? new DelegatingDecompressorFrameListener(connection(), frameListener, false) : frameListener;
333339
if (accessLogManagerFactory != null) {
334340
accessLogManager = new Http2AccessLogManager(accessLogManagerFactory, connection());
335341
fl = new Http2AccessLogFrameListener(fl, accessLogManager);

http-server-netty/src/test/groovy/io/micronaut/http/server/netty/RequestDecompressionConfigSpec.groovy

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,15 @@ import java.util.concurrent.ThreadLocalRandom
2323

2424
class RequestDecompressionConfigSpec extends Specification {
2525

26-
def 'server request decompression can be disabled'(CharSequence contentEncoding, Object compressor) {
26+
def 'server request decompression can be disabled'(CharSequence contentEncoding, Object compressor, boolean http2) {
2727
given: 'an embedded server with request decompression disabled'
2828
Map<String, Object> cfg = [
29-
'spec.name' : 'RequestDecompressionConfigSpec',
30-
'micronaut.server.netty.request-decompression-enabled': false
29+
'spec.name' : 'RequestDecompressionConfigSpec',
30+
'micronaut.server.netty.request-decompression-enabled' : false,
31+
'micronaut.server.ssl.port' : 0,
32+
'micronaut.http.client.http-version' : http2 ? '2.0' : '1.1',
33+
'micronaut.server.http-version' : http2 ? '2.0' : '1.1',
34+
'micronaut.http.client.ssl.insecure-trust-all-certificates': true,
3135
]
3236
EmbeddedServer server = ApplicationContext.run(EmbeddedServer, cfg)
3337
def client = server.applicationContext.createBean(HttpClient, server.URI).toBlocking()
@@ -67,15 +71,23 @@ class RequestDecompressionConfigSpec extends Specification {
6771
server.stop()
6872

6973
where:
70-
contentEncoding | compressor
71-
HttpHeaderValues.GZIP | ZlibWrapper.GZIP
72-
HttpHeaderValues.X_GZIP | ZlibWrapper.GZIP
74+
contentEncoding | compressor | http2
75+
HttpHeaderValues.GZIP | ZlibWrapper.GZIP | false
76+
HttpHeaderValues.X_GZIP | ZlibWrapper.GZIP | false
7377
// deflate can mean raw (NONE) or zlib wrapper; ensure both do not get decompressed by server
74-
HttpHeaderValues.DEFLATE | ZlibWrapper.NONE
75-
HttpHeaderValues.X_DEFLATE | ZlibWrapper.NONE
76-
HttpHeaderValues.DEFLATE | ZlibWrapper.ZLIB
77-
HttpHeaderValues.X_DEFLATE | ZlibWrapper.ZLIB
78-
HttpHeaderValues.SNAPPY | new SnappyFrameEncoder()
78+
HttpHeaderValues.DEFLATE | ZlibWrapper.NONE | false
79+
HttpHeaderValues.X_DEFLATE | ZlibWrapper.NONE | false
80+
HttpHeaderValues.DEFLATE | ZlibWrapper.ZLIB | false
81+
HttpHeaderValues.X_DEFLATE | ZlibWrapper.ZLIB | false
82+
HttpHeaderValues.SNAPPY | new SnappyFrameEncoder() | false
83+
HttpHeaderValues.GZIP | ZlibWrapper.GZIP | true
84+
HttpHeaderValues.X_GZIP | ZlibWrapper.GZIP | true
85+
// deflate can mean raw (NONE) or zlib wrapper; ensure both do not get decompressed by server
86+
HttpHeaderValues.DEFLATE | ZlibWrapper.NONE | true
87+
HttpHeaderValues.X_DEFLATE | ZlibWrapper.NONE | true
88+
HttpHeaderValues.DEFLATE | ZlibWrapper.ZLIB | true
89+
HttpHeaderValues.X_DEFLATE | ZlibWrapper.ZLIB | true
90+
HttpHeaderValues.SNAPPY | new SnappyFrameEncoder() | true
7991
}
8092

8193
@Requires(property = "spec.name", value = "RequestDecompressionConfigSpec")

0 commit comments

Comments
 (0)