1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package io.netty5.handler.codec.http;
17
18 import io.netty5.handler.codec.compression.Brotli;
19 import io.netty5.handler.codec.compression.BrotliDecompressor;
20 import io.netty5.handler.codec.compression.Decompressor;
21 import io.netty5.handler.codec.compression.ZlibDecompressor;
22 import io.netty5.handler.codec.compression.ZlibWrapper;
23
24 import static io.netty5.handler.codec.http.HttpHeaderValues.BR;
25 import static io.netty5.handler.codec.http.HttpHeaderValues.DEFLATE;
26 import static io.netty5.handler.codec.http.HttpHeaderValues.GZIP;
27 import static io.netty5.handler.codec.http.HttpHeaderValues.X_DEFLATE;
28 import static io.netty5.handler.codec.http.HttpHeaderValues.X_GZIP;
29
30
31
32
33
34
35 public class HttpContentDecompressor extends HttpContentDecoder {
36
37 private final boolean strict;
38
39
40
41
42 public HttpContentDecompressor() {
43 this(false);
44 }
45
46
47
48
49
50
51
52 public HttpContentDecompressor(boolean strict) {
53 this.strict = strict;
54 }
55
56 @Override
57 protected Decompressor newContentDecoder(String contentEncoding) throws Exception {
58 if (GZIP.contentEqualsIgnoreCase(contentEncoding) ||
59 X_GZIP.contentEqualsIgnoreCase(contentEncoding)) {
60 return ZlibDecompressor.newFactory(ZlibWrapper.GZIP).get();
61 }
62 if (DEFLATE.contentEqualsIgnoreCase(contentEncoding) ||
63 X_DEFLATE.contentEqualsIgnoreCase(contentEncoding)) {
64 final ZlibWrapper wrapper = strict ? ZlibWrapper.ZLIB : ZlibWrapper.ZLIB_OR_NONE;
65 ZlibDecompressor.newFactory(wrapper).get();
66 }
67 if (Brotli.isAvailable() && BR.contentEqualsIgnoreCase(contentEncoding)) {
68 return BrotliDecompressor.newFactory().get();
69 }
70
71
72 return null;
73 }
74 }