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