Skip to content

Commit dfca00b

Browse files
committed
Add Constructor with custom compression level
1 parent 4f4aed5 commit dfca00b

File tree

2 files changed

+34
-72
lines changed

2 files changed

+34
-72
lines changed

src/main/java/org/java_websocket/extensions/permessage_deflate/PerMessageDeflateExtension.java

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,11 @@
1313
import org.java_websocket.extensions.CompressionExtension;
1414
import org.java_websocket.extensions.ExtensionRequestData;
1515
import org.java_websocket.extensions.IExtension;
16-
import org.java_websocket.framing.BinaryFrame;
1716
import org.java_websocket.framing.CloseFrame;
1817
import org.java_websocket.framing.ContinuousFrame;
1918
import org.java_websocket.framing.DataFrame;
2019
import org.java_websocket.framing.Framedata;
2120
import org.java_websocket.framing.FramedataImpl1;
22-
import org.java_websocket.framing.TextFrame;
2321

2422
/**
2523
* PerMessage Deflate Extension (<a href="https://tools.ietf.org/html/rfc7692#section-7">7&#46; The
@@ -53,28 +51,37 @@ public class PerMessageDeflateExtension extends CompressionExtension {
5351
// For WebSocketClients, this variable holds the extension parameters that client himself has requested.
5452
private Map<String, String> requestedParameters = new LinkedHashMap<>();
5553

56-
private int deflaterLevel = Deflater.DEFAULT_COMPRESSION;
54+
private final int compressionLevel;
5755

58-
private Inflater inflater = new Inflater(true);
59-
private Deflater deflater = new Deflater(this.deflaterLevel, true);
56+
private final Inflater inflater;
57+
private final Deflater deflater;
6058

6159
/**
62-
* Get the compression level used for the compressor.
63-
* @return the compression level (0-9)
60+
* Constructor for the PerMessage Deflate Extension (<a href="https://tools.ietf.org/html/rfc7692#section-7">7&#46; Thepermessage-deflate" Extension</a>)
61+
*
62+
* Uses {@link java.util.zip.Deflater#DEFAULT_COMPRESSION} as the compression level for the {@link java.util.zip.Deflater#Deflater(int)}
63+
*/
64+
public PerMessageDeflateExtension() {
65+
this(Deflater.DEFAULT_COMPRESSION);
66+
}
67+
68+
/**
69+
* Constructor for the PerMessage Deflate Extension (<a href="https://tools.ietf.org/html/rfc7692#section-7">7&#46; Thepermessage-deflate" Extension</a>)
70+
*
71+
* @param compressionLevel The compression level passed to the {@link java.util.zip.Deflater#Deflater(int)}
6472
*/
65-
public int getDeflaterLevel() {
66-
return this.deflaterLevel;
73+
public PerMessageDeflateExtension(int compressionLevel) {
74+
this.compressionLevel = compressionLevel;
75+
this.deflater = new Deflater(this.compressionLevel, true);
76+
this.inflater = new Inflater(true);
6777
}
6878

6979
/**
70-
* Set the compression level used for the compressor.
71-
* @param level the compression level (0-9)
80+
* Get the compression level used for the compressor.
81+
* @return the compression level
7282
*/
73-
public void setDeflaterLevel(int level) {
74-
this.deflater.setLevel(level);
75-
this.deflaterLevel = level;
76-
//If the compression level is changed, the next invocation of deflate will compress the input available so far with the old level (and may be flushed); the new level will take effect only after that invocation.
77-
this.deflater.deflate(new byte[0]);
83+
public int getCompressionLevel() {
84+
return this.compressionLevel;
7885
}
7986

8087
/**
@@ -334,11 +341,10 @@ public String getProvidedExtensionAsServer() {
334341

335342
@Override
336343
public IExtension copyInstance() {
337-
PerMessageDeflateExtension clone = new PerMessageDeflateExtension();
344+
PerMessageDeflateExtension clone = new PerMessageDeflateExtension(this.getCompressionLevel());
338345
clone.setThreshold(this.getThreshold());
339346
clone.setClientNoContextTakeover(this.isClientNoContextTakeover());
340347
clone.setServerNoContextTakeover(this.isServerNoContextTakeover());
341-
clone.setDeflaterLevel(this.getDeflaterLevel());
342348
return clone;
343349
}
344350

src/test/java/org/java_websocket/extensions/PerMessageDeflateExtensionTest.java

Lines changed: 10 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package org.java_websocket.extensions;
22

3-
import static java.util.zip.GZIPInputStream.GZIP_MAGIC;
43
import static org.junit.Assert.assertArrayEquals;
54
import static org.junit.Assert.assertEquals;
65
import static org.junit.Assert.assertFalse;
@@ -10,10 +9,9 @@
109
import java.nio.ByteBuffer;
1110
import java.util.Arrays;
1211
import java.util.zip.Deflater;
13-
import java.util.zip.Inflater;
12+
1413
import org.java_websocket.exceptions.InvalidDataException;
1514
import org.java_websocket.extensions.permessage_deflate.PerMessageDeflateExtension;
16-
import org.java_websocket.framing.BinaryFrame;
1715
import org.java_websocket.framing.ContinuousFrame;
1816
import org.java_websocket.framing.TextFrame;
1917
import org.junit.Test;
@@ -55,8 +53,7 @@ public void testDecodeFrameIfRSVIsNotSet() throws InvalidDataException {
5553

5654
@Test
5755
public void testDecodeFrameNoCompression() throws InvalidDataException {
58-
PerMessageDeflateExtension deflateExtension = new PerMessageDeflateExtension();
59-
deflateExtension.setDeflaterLevel(Deflater.NO_COMPRESSION);
56+
PerMessageDeflateExtension deflateExtension = new PerMessageDeflateExtension(Deflater.NO_COMPRESSION);
6057
deflateExtension.setThreshold(0);
6158
String str = "This is a highly compressable text"
6259
+ "This is a highly compressable text"
@@ -76,8 +73,7 @@ public void testDecodeFrameNoCompression() throws InvalidDataException {
7673

7774
@Test
7875
public void testDecodeFrameBestSpeedCompression() throws InvalidDataException {
79-
PerMessageDeflateExtension deflateExtension = new PerMessageDeflateExtension();
80-
deflateExtension.setDeflaterLevel(Deflater.BEST_SPEED);
76+
PerMessageDeflateExtension deflateExtension = new PerMessageDeflateExtension(Deflater.BEST_SPEED);
8177
deflateExtension.setThreshold(0);
8278
String str = "This is a highly compressable text"
8379
+ "This is a highly compressable text"
@@ -103,8 +99,7 @@ public void testDecodeFrameBestSpeedCompression() throws InvalidDataException {
10399

104100
@Test
105101
public void testDecodeFrameBestCompression() throws InvalidDataException {
106-
PerMessageDeflateExtension deflateExtension = new PerMessageDeflateExtension();
107-
deflateExtension.setDeflaterLevel(Deflater.BEST_COMPRESSION);
102+
PerMessageDeflateExtension deflateExtension = new PerMessageDeflateExtension(Deflater.BEST_COMPRESSION);
108103
deflateExtension.setThreshold(0);
109104
String str = "This is a highly compressable text"
110105
+ "This is a highly compressable text"
@@ -128,35 +123,6 @@ public void testDecodeFrameBestCompression() throws InvalidDataException {
128123
assertArrayEquals(message, frame.getPayloadData().array());
129124
}
130125

131-
@Test
132-
public void testDecodeFrameSwitchCompression() throws InvalidDataException {
133-
PerMessageDeflateExtension deflateExtension = new PerMessageDeflateExtension();
134-
deflateExtension.setDeflaterLevel(Deflater.NO_COMPRESSION);
135-
deflateExtension.setThreshold(0);
136-
String str = "This is a highly compressable text"
137-
+ "This is a highly compressable text"
138-
+ "This is a highly compressable text"
139-
+ "This is a highly compressable text"
140-
+ "This is a highly compressable text";
141-
byte[] message = str.getBytes();
142-
TextFrame frame = new TextFrame();
143-
frame.setPayload(ByteBuffer.wrap(message));
144-
145-
Deflater localDeflater = new Deflater(Deflater.BEST_COMPRESSION,true);
146-
localDeflater.setInput(ByteBuffer.wrap(message).array());
147-
byte[] buffer = new byte[1024];
148-
int bytesCompressed = localDeflater.deflate(buffer, 0, buffer.length, Deflater.SYNC_FLUSH);
149-
150-
// Change the deflater level after the creation and switch to a new deflater level
151-
// Compression strategy should be applied instantly since we call .deflate manually
152-
deflateExtension.setDeflaterLevel(Deflater.BEST_COMPRESSION);
153-
deflateExtension.encodeFrame(frame);
154-
byte[] payloadArray = frame.getPayloadData().array();
155-
assertArrayEquals(Arrays.copyOfRange(buffer,0, bytesCompressed), Arrays.copyOfRange(payloadArray,0,payloadArray.length));
156-
assertTrue(frame.isRSV1());
157-
deflateExtension.decodeFrame(frame);
158-
assertArrayEquals(message, frame.getPayloadData().array());
159-
}
160126

161127
@Test
162128
public void testEncodeFrame() {
@@ -304,41 +270,31 @@ public void testCopyInstance() {
304270
assertEquals(deflateExtension.getThreshold(), newDeflateExtension.getThreshold());
305271
assertEquals(deflateExtension.isClientNoContextTakeover(), newDeflateExtension.isClientNoContextTakeover());
306272
assertEquals(deflateExtension.isServerNoContextTakeover(), newDeflateExtension.isServerNoContextTakeover());
307-
assertEquals(deflateExtension.getDeflaterLevel(), newDeflateExtension.getDeflaterLevel());
273+
assertEquals(deflateExtension.getCompressionLevel(), newDeflateExtension.getCompressionLevel());
308274

309275

310-
deflateExtension = new PerMessageDeflateExtension();
276+
deflateExtension = new PerMessageDeflateExtension(Deflater.BEST_COMPRESSION);
311277
deflateExtension.setThreshold(512);
312278
deflateExtension.setServerNoContextTakeover(false);
313279
deflateExtension.setClientNoContextTakeover(true);
314-
deflateExtension.setDeflaterLevel(Deflater.BEST_COMPRESSION);
315280
newDeflateExtension = (PerMessageDeflateExtension)deflateExtension.copyInstance();
316281

317282
assertEquals(deflateExtension.getThreshold(), newDeflateExtension.getThreshold());
318283
assertEquals(deflateExtension.isClientNoContextTakeover(), newDeflateExtension.isClientNoContextTakeover());
319284
assertEquals(deflateExtension.isServerNoContextTakeover(), newDeflateExtension.isServerNoContextTakeover());
320-
assertEquals(deflateExtension.getDeflaterLevel(), newDeflateExtension.getDeflaterLevel());
285+
assertEquals(deflateExtension.getCompressionLevel(), newDeflateExtension.getCompressionLevel());
321286

322287

323-
deflateExtension = new PerMessageDeflateExtension();
288+
deflateExtension = new PerMessageDeflateExtension(Deflater.NO_COMPRESSION);
324289
deflateExtension.setThreshold(64);
325290
deflateExtension.setServerNoContextTakeover(true);
326291
deflateExtension.setClientNoContextTakeover(false);
327-
deflateExtension.setDeflaterLevel(Deflater.NO_COMPRESSION);
328292
newDeflateExtension = (PerMessageDeflateExtension)deflateExtension.copyInstance();
329293

330294
assertEquals(deflateExtension.getThreshold(), newDeflateExtension.getThreshold());
331295
assertEquals(deflateExtension.isClientNoContextTakeover(), newDeflateExtension.isClientNoContextTakeover());
332296
assertEquals(deflateExtension.isServerNoContextTakeover(), newDeflateExtension.isServerNoContextTakeover());
333-
assertEquals(deflateExtension.getDeflaterLevel(), newDeflateExtension.getDeflaterLevel());
334-
}
335-
336-
@Test
337-
public void testDeflaterLevel() {
338-
PerMessageDeflateExtension deflateExtension = new PerMessageDeflateExtension();
339-
assertEquals(Deflater.DEFAULT_COMPRESSION, deflateExtension.getDeflaterLevel());
340-
deflateExtension.setDeflaterLevel(Deflater.BEST_SPEED);
341-
assertEquals(Deflater.BEST_SPEED, deflateExtension.getDeflaterLevel());
297+
assertEquals(deflateExtension.getCompressionLevel(), newDeflateExtension.getCompressionLevel());
342298
}
343299

344300
@Test
@@ -347,6 +303,6 @@ public void testDefaults() {
347303
assertFalse(deflateExtension.isClientNoContextTakeover());
348304
assertTrue(deflateExtension.isServerNoContextTakeover());
349305
assertEquals(1024, deflateExtension.getThreshold());
350-
assertEquals(Deflater.DEFAULT_COMPRESSION, deflateExtension.getDeflaterLevel());
306+
assertEquals(Deflater.DEFAULT_COMPRESSION, deflateExtension.getCompressionLevel());
351307
}
352308
}

0 commit comments

Comments
 (0)