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 import static io.netty.handler.codec.http.HttpHeaderValues.ZSTD;
25 import static io.netty.util.internal.ObjectUtil.checkPositiveOrZero;
26
27 import io.netty.channel.embedded.EmbeddedChannel;
28 import io.netty.handler.codec.compression.Brotli;
29 import io.netty.handler.codec.compression.BrotliDecoder;
30 import io.netty.handler.codec.compression.SnappyFrameDecoder;
31 import io.netty.handler.codec.compression.ZlibCodecFactory;
32 import io.netty.handler.codec.compression.ZlibWrapper;
33 import io.netty.handler.codec.compression.Zstd;
34 import io.netty.handler.codec.compression.ZstdDecoder;
35
36
37
38
39
40
41 public class HttpContentDecompressor extends HttpContentDecoder {
42
43 private final boolean strict;
44 private final int maxAllocation;
45
46
47
48
49
50
51 @Deprecated
52 public HttpContentDecompressor() {
53 this(false, 0);
54 }
55
56
57
58
59
60
61 public HttpContentDecompressor(int maxAllocation) {
62 this(false, maxAllocation);
63 }
64
65
66
67
68
69
70
71
72
73 @Deprecated
74 public HttpContentDecompressor(boolean strict) {
75 this(strict, 0);
76 }
77
78
79
80
81
82
83
84
85
86 public HttpContentDecompressor(boolean strict, int maxAllocation) {
87 this.strict = strict;
88 this.maxAllocation = checkPositiveOrZero(maxAllocation, "maxAllocation");
89 }
90
91 @Override
92 protected EmbeddedChannel newContentDecoder(String contentEncoding) throws Exception {
93 if (GZIP.contentEqualsIgnoreCase(contentEncoding) ||
94 X_GZIP.contentEqualsIgnoreCase(contentEncoding)) {
95 return new EmbeddedChannel(ctx.channel().id(), ctx.channel().metadata().hasDisconnect(),
96 ctx.channel().config(), ZlibCodecFactory.newZlibDecoder(ZlibWrapper.GZIP, maxAllocation));
97 }
98 if (DEFLATE.contentEqualsIgnoreCase(contentEncoding) ||
99 X_DEFLATE.contentEqualsIgnoreCase(contentEncoding)) {
100 final ZlibWrapper wrapper = strict ? ZlibWrapper.ZLIB : ZlibWrapper.ZLIB_OR_NONE;
101
102 return new EmbeddedChannel(ctx.channel().id(), ctx.channel().metadata().hasDisconnect(),
103 ctx.channel().config(), ZlibCodecFactory.newZlibDecoder(wrapper, maxAllocation));
104 }
105 if (Brotli.isAvailable() && BR.contentEqualsIgnoreCase(contentEncoding)) {
106 return new EmbeddedChannel(ctx.channel().id(), ctx.channel().metadata().hasDisconnect(),
107 ctx.channel().config(), new BrotliDecoder());
108 }
109
110 if (SNAPPY.contentEqualsIgnoreCase(contentEncoding)) {
111 return new EmbeddedChannel(ctx.channel().id(), ctx.channel().metadata().hasDisconnect(),
112 ctx.channel().config(), new SnappyFrameDecoder());
113 }
114
115 if (Zstd.isAvailable() && ZSTD.contentEqualsIgnoreCase(contentEncoding)) {
116 return new EmbeddedChannel(ctx.channel().id(), ctx.channel().metadata().hasDisconnect(),
117 ctx.channel().config(), new ZstdDecoder());
118 }
119
120
121 return null;
122 }
123 }