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.extensions.WebSocketClientExtension;
19  import io.netty.handler.codec.http.websocketx.extensions.WebSocketClientExtensionHandshaker;
20  import io.netty.handler.codec.http.websocketx.extensions.WebSocketExtensionData;
21  import io.netty.handler.codec.http.websocketx.extensions.WebSocketExtensionDecoder;
22  import io.netty.handler.codec.http.websocketx.extensions.WebSocketExtensionEncoder;
23  import io.netty.handler.codec.http.websocketx.extensions.WebSocketExtensionFilterProvider;
24  
25  import java.util.Collections;
26  
27  import static io.netty.handler.codec.http.websocketx.extensions.compression.DeflateFrameServerExtensionHandshaker.*;
28  import static io.netty.util.internal.ObjectUtil.*;
29  
30  
31  
32  
33  
34  public final class DeflateFrameClientExtensionHandshaker implements WebSocketClientExtensionHandshaker {
35  
36      private final int compressionLevel;
37      private final boolean useWebkitExtensionName;
38      private final WebSocketExtensionFilterProvider extensionFilterProvider;
39      private final int maxAllocation;
40  
41      
42  
43  
44  
45  
46  
47      @Deprecated
48      public DeflateFrameClientExtensionHandshaker(boolean useWebkitExtensionName) {
49          this(6, useWebkitExtensionName, 0);
50      }
51  
52      
53  
54  
55  
56  
57  
58      public DeflateFrameClientExtensionHandshaker(boolean useWebkitExtensionName, int maxAllocation) {
59          this(6, useWebkitExtensionName, maxAllocation);
60      }
61  
62      
63  
64  
65  
66  
67  
68  
69  
70  
71      @Deprecated
72      public DeflateFrameClientExtensionHandshaker(int compressionLevel, boolean useWebkitExtensionName) {
73          this(compressionLevel, useWebkitExtensionName, 0);
74      }
75  
76      
77  
78  
79  
80  
81  
82  
83  
84      public DeflateFrameClientExtensionHandshaker(int compressionLevel, boolean useWebkitExtensionName,
85                                                   int maxAllocation) {
86          this(compressionLevel, useWebkitExtensionName, WebSocketExtensionFilterProvider.DEFAULT, maxAllocation);
87      }
88  
89      
90  
91  
92  
93  
94  
95  
96  
97  
98  
99  
100     @Deprecated
101     public DeflateFrameClientExtensionHandshaker(int compressionLevel, boolean useWebkitExtensionName,
102                                                  WebSocketExtensionFilterProvider extensionFilterProvider) {
103         this(compressionLevel, useWebkitExtensionName, extensionFilterProvider, 0);
104     }
105 
106     
107 
108 
109 
110 
111 
112 
113 
114 
115 
116     public DeflateFrameClientExtensionHandshaker(int compressionLevel, boolean useWebkitExtensionName,
117             WebSocketExtensionFilterProvider extensionFilterProvider, int maxAllocation) {
118         if (compressionLevel < 0 || compressionLevel > 9) {
119             throw new IllegalArgumentException(
120                     "compressionLevel: " + compressionLevel + " (expected: 0-9)");
121         }
122         this.compressionLevel = compressionLevel;
123         this.useWebkitExtensionName = useWebkitExtensionName;
124         this.extensionFilterProvider = checkNotNull(extensionFilterProvider, "extensionFilterProvider");
125         this.maxAllocation = checkPositiveOrZero(maxAllocation, "maxAllocation");
126     }
127 
128     @Override
129     public WebSocketExtensionData newRequestData() {
130         return new WebSocketExtensionData(
131                 useWebkitExtensionName ? X_WEBKIT_DEFLATE_FRAME_EXTENSION : DEFLATE_FRAME_EXTENSION,
132                 Collections.<String, String>emptyMap());
133     }
134 
135     @Override
136     public WebSocketClientExtension handshakeExtension(WebSocketExtensionData extensionData) {
137         if (!X_WEBKIT_DEFLATE_FRAME_EXTENSION.equals(extensionData.name()) &&
138             !DEFLATE_FRAME_EXTENSION.equals(extensionData.name())) {
139             return null;
140         }
141 
142         if (extensionData.parameters().isEmpty()) {
143             return new DeflateFrameClientExtension(compressionLevel, extensionFilterProvider, maxAllocation);
144         } else {
145             return null;
146         }
147     }
148 
149     private static class DeflateFrameClientExtension implements WebSocketClientExtension {
150 
151         private final int compressionLevel;
152         private final WebSocketExtensionFilterProvider extensionFilterProvider;
153         private final int maxAllocation;
154 
155         DeflateFrameClientExtension(int compressionLevel, WebSocketExtensionFilterProvider extensionFilterProvider,
156                                     int maxAllocation) {
157             this.compressionLevel = compressionLevel;
158             this.extensionFilterProvider = extensionFilterProvider;
159             this.maxAllocation = maxAllocation;
160         }
161 
162         @Override
163         public int rsv() {
164             return RSV1;
165         }
166 
167         @Override
168         public WebSocketExtensionEncoder newExtensionEncoder() {
169             return new PerFrameDeflateEncoder(compressionLevel, 15, false,
170                                               extensionFilterProvider.encoderFilter());
171         }
172 
173         @Override
174         public WebSocketExtensionDecoder newExtensionDecoder() {
175             return new PerFrameDeflateDecoder(false, extensionFilterProvider.decoderFilter(), maxAllocation);
176         }
177     }
178 
179 }