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.handler.codec.http.websocketx.BinaryWebSocketFrame;
19  import io.netty.handler.codec.http.websocketx.ContinuationWebSocketFrame;
20  import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
21  import io.netty.handler.codec.http.websocketx.WebSocketFrame;
22  import io.netty.handler.codec.http.websocketx.extensions.WebSocketExtension;
23  import io.netty.handler.codec.http.websocketx.extensions.WebSocketExtensionFilter;
24  
25  
26  
27  
28  class PerFrameDeflateEncoder extends DeflateEncoder {
29  
30      
31  
32  
33  
34  
35  
36  
37      PerFrameDeflateEncoder(int compressionLevel, int windowSize, boolean noContext) {
38          super(compressionLevel, windowSize, noContext, WebSocketExtensionFilter.NEVER_SKIP);
39      }
40  
41      
42  
43  
44  
45  
46  
47  
48  
49      PerFrameDeflateEncoder(int compressionLevel, int windowSize, boolean noContext,
50                             WebSocketExtensionFilter extensionEncoderFilter) {
51          super(compressionLevel, windowSize, noContext, extensionEncoderFilter);
52      }
53  
54      @Override
55      public boolean acceptOutboundMessage(Object msg) throws Exception {
56          if (!super.acceptOutboundMessage(msg)) {
57              return false;
58          }
59  
60          WebSocketFrame wsFrame = (WebSocketFrame) msg;
61          if (extensionEncoderFilter().mustSkip(wsFrame)) {
62              return false;
63          }
64  
65          return (msg instanceof TextWebSocketFrame || msg instanceof BinaryWebSocketFrame ||
66                  msg instanceof ContinuationWebSocketFrame) &&
67                 wsFrame.content().readableBytes() > 0 &&
68                 (wsFrame.rsv() & WebSocketExtension.RSV1) == 0;
69      }
70  
71      @Override
72      protected int rsv(WebSocketFrame msg) {
73          return msg.rsv() | WebSocketExtension.RSV1;
74      }
75  
76      @Override
77      protected boolean removeFrameTail(WebSocketFrame msg) {
78          return true;
79      }
80  
81  }