1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package io.netty.handler.codec.http.websocketx.extensions.compression;
17
18 import io.netty.channel.ChannelHandlerContext;
19 import io.netty.handler.codec.http.websocketx.BinaryWebSocketFrame;
20 import io.netty.handler.codec.http.websocketx.ContinuationWebSocketFrame;
21 import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
22 import io.netty.handler.codec.http.websocketx.WebSocketFrame;
23 import io.netty.handler.codec.http.websocketx.extensions.WebSocketExtension;
24 import io.netty.handler.codec.http.websocketx.extensions.WebSocketExtensionFilter;
25
26 import java.util.List;
27
28
29
30
31 class PerMessageDeflateDecoder extends DeflateDecoder {
32
33 private boolean compressing;
34
35
36
37
38
39
40
41
42 PerMessageDeflateDecoder(boolean noContext, int maxAllocation) {
43 super(noContext, WebSocketExtensionFilter.NEVER_SKIP, maxAllocation);
44 }
45
46
47
48
49
50
51
52
53
54 PerMessageDeflateDecoder(boolean noContext, WebSocketExtensionFilter extensionDecoderFilter, int maxAllocation) {
55 super(noContext, extensionDecoderFilter, maxAllocation);
56 }
57
58 @Override
59 public boolean acceptInboundMessage(Object msg) throws Exception {
60 if (!super.acceptInboundMessage(msg)) {
61 return false;
62 }
63
64 WebSocketFrame wsFrame = (WebSocketFrame) msg;
65 if (extensionDecoderFilter().mustSkip(wsFrame)) {
66 if (compressing) {
67 throw new IllegalStateException("Cannot skip per message deflate decoder, compression in progress");
68 }
69 return false;
70 }
71
72 return ((wsFrame instanceof TextWebSocketFrame || wsFrame instanceof BinaryWebSocketFrame) &&
73 (wsFrame.rsv() & WebSocketExtension.RSV1) > 0) ||
74 (wsFrame instanceof ContinuationWebSocketFrame && compressing);
75 }
76
77 @Override
78 protected int newRsv(WebSocketFrame msg) {
79 return (msg.rsv() & WebSocketExtension.RSV1) > 0?
80 msg.rsv() ^ WebSocketExtension.RSV1 : msg.rsv();
81 }
82
83 @Override
84 protected boolean appendFrameTail(WebSocketFrame msg) {
85 return msg.isFinalFragment();
86 }
87
88 @Override
89 protected void decode(ChannelHandlerContext ctx, WebSocketFrame msg,
90 List<Object> out) throws Exception {
91 super.decode(ctx, msg, out);
92
93 if (msg.isFinalFragment()) {
94 compressing = false;
95 } else if (msg instanceof TextWebSocketFrame || msg instanceof BinaryWebSocketFrame) {
96 compressing = true;
97 }
98 }
99
100 }