1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package io.netty.handler.codec.http;
17
18 import static io.netty.handler.codec.http.HttpHeaderValues.BR;
19 import static io.netty.handler.codec.http.HttpHeaderValues.DEFLATE;
20 import static io.netty.handler.codec.http.HttpHeaderValues.GZIP;
21 import static io.netty.handler.codec.http.HttpHeaderValues.X_DEFLATE;
22 import static io.netty.handler.codec.http.HttpHeaderValues.X_GZIP;
23 import static io.netty.handler.codec.http.HttpHeaderValues.SNAPPY;
24
25 import io.netty.channel.embedded.EmbeddedChannel;
26 import io.netty.handler.codec.compression.Brotli;
27 import io.netty.handler.codec.compression.BrotliDecoder;
28 import io.netty.handler.codec.compression.ZlibCodecFactory;
29 import io.netty.handler.codec.compression.ZlibWrapper;
30 import io.netty.handler.codec.compression.SnappyFrameDecoder;
31
32
33
34
35
36
37 public class HttpContentDecompressor extends HttpContentDecoder {
38
39 private final boolean strict;
40
41
42
43
44 public HttpContentDecompressor() {
45 this(false);
46 }
47
48
49
50
51
52
53
54 public HttpContentDecompressor(boolean strict) {
55 this.strict = strict;
56 }
57
58 @Override
59 protected EmbeddedChannel newContentDecoder(String contentEncoding) throws Exception {
60 if (GZIP.contentEqualsIgnoreCase(contentEncoding) ||
61 X_GZIP.contentEqualsIgnoreCase(contentEncoding)) {
62 return new EmbeddedChannel(ctx.channel().id(), ctx.channel().metadata().hasDisconnect(),
63 ctx.channel().config(), ZlibCodecFactory.newZlibDecoder(ZlibWrapper.GZIP));
64 }
65 if (DEFLATE.contentEqualsIgnoreCase(contentEncoding) ||
66 X_DEFLATE.contentEqualsIgnoreCase(contentEncoding)) {
67 final ZlibWrapper wrapper = strict ? ZlibWrapper.ZLIB : ZlibWrapper.ZLIB_OR_NONE;
68
69 return new EmbeddedChannel(ctx.channel().id(), ctx.channel().metadata().hasDisconnect(),
70 ctx.channel().config(), ZlibCodecFactory.newZlibDecoder(wrapper));
71 }
72 if (Brotli.isAvailable() && BR.contentEqualsIgnoreCase(contentEncoding)) {
73 return new EmbeddedChannel(ctx.channel().id(), ctx.channel().metadata().hasDisconnect(),
74 ctx.channel().config(), new BrotliDecoder());
75 }
76
77 if (SNAPPY.contentEqualsIgnoreCase(contentEncoding)) {
78 return new EmbeddedChannel(ctx.channel().id(), ctx.channel().metadata().hasDisconnect(),
79 ctx.channel().config(), new SnappyFrameDecoder());
80 }
81
82
83 return null;
84 }
85 }