Skip to content

Commit f525dd8

Browse files
committed
Make WebSocket compression actually work
Add a new implementation of RFC 7962 WebSocket Compression, with tests verifying the examples from RFC 7962, full extension parameter handling, compression ratio statistics and maximum decompressed frame size limit. Adapt MultiProtocolJSONClient and MultiProtocolJSONServer to use this new implementation.
1 parent 95080cf commit f525dd8

File tree

4 files changed

+866
-14
lines changed

4 files changed

+866
-14
lines changed

ocpp-v2/src/main/java/eu/chargetime/ocpp/MultiProtocolJSONClient.java

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@
4444
import org.java_websocket.drafts.Draft;
4545
import org.java_websocket.drafts.Draft_6455;
4646
import org.java_websocket.extensions.IExtension;
47-
import org.java_websocket.extensions.permessage_deflate.PerMessageDeflateExtension;
4847
import org.java_websocket.protocols.IProtocol;
4948
import org.java_websocket.protocols.Protocol;
5049
import org.slf4j.Logger;
@@ -58,6 +57,7 @@ public class MultiProtocolJSONClient implements IMultiProtocolClientAPI {
5857
private final String identity;
5958
private final MultiProtocolFeatureRepository featureRepository;
6059
private final MultiProtocolWebSocketTransmitter transmitter;
60+
private final WebSocketPerMessageDeflateExtension compressionExtension;
6161
private final Client client;
6262

6363
/**
@@ -92,12 +92,13 @@ public MultiProtocolJSONClient(
9292
featureRepository = new MultiProtocolFeatureRepository(protocolVersions);
9393
List<IExtension> inputExtensions = new ArrayList<>();
9494
if (configuration.getParameter(JSONConfiguration.WEBSOCKET_COMPRESSION_SUPPORT, false)) {
95-
PerMessageDeflateExtension perMessageDeflateExtension =
96-
new PerMessageDeflateExtension(Deflater.BEST_COMPRESSION);
97-
perMessageDeflateExtension.setThreshold(0);
98-
perMessageDeflateExtension.setServerNoContextTakeover(false);
99-
perMessageDeflateExtension.setClientNoContextTakeover(false);
100-
inputExtensions.add(perMessageDeflateExtension);
95+
compressionExtension = new WebSocketPerMessageDeflateExtension(Deflater.BEST_COMPRESSION);
96+
compressionExtension.setThreshold(64);
97+
compressionExtension.setServerNoContextTakeover(false);
98+
compressionExtension.setClientNoContextTakeover(false);
99+
inputExtensions.add(compressionExtension);
100+
} else {
101+
compressionExtension = null;
101102
}
102103
List<IProtocol> inputProtocols = new ArrayList<>(protocolVersions.size());
103104
for (ProtocolVersion protocolVersion : protocolVersions) {
@@ -221,6 +222,10 @@ public Exception getLastError() {
221222
return transmitter.getLastError();
222223
}
223224

225+
public double getCompressionRatio() {
226+
return compressionExtension != null ? compressionExtension.getCompressionRatio() : 1;
227+
}
228+
224229
@Override
225230
public boolean isClosed() {
226231
return transmitter.isClosed();

ocpp-v2/src/main/java/eu/chargetime/ocpp/MultiProtocolJSONServer.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ of this software and associated documentation files (the "Software"), to deal
4343
import org.java_websocket.drafts.Draft;
4444
import org.java_websocket.drafts.Draft_6455;
4545
import org.java_websocket.extensions.IExtension;
46-
import org.java_websocket.extensions.permessage_deflate.PerMessageDeflateExtension;
4746
import org.java_websocket.protocols.IProtocol;
4847
import org.java_websocket.protocols.Protocol;
4948
import org.slf4j.Logger;
@@ -71,12 +70,12 @@ public MultiProtocolJSONServer(
7170

7271
List<IExtension> extensions = new ArrayList<>();
7372
if (configuration.getParameter(JSONConfiguration.WEBSOCKET_COMPRESSION_SUPPORT, true)) {
74-
PerMessageDeflateExtension perMessageDeflateExtension =
75-
new PerMessageDeflateExtension(Deflater.BEST_COMPRESSION);
76-
perMessageDeflateExtension.setThreshold(0);
77-
perMessageDeflateExtension.setServerNoContextTakeover(false);
78-
perMessageDeflateExtension.setClientNoContextTakeover(false);
79-
extensions.add(perMessageDeflateExtension);
73+
WebSocketPerMessageDeflateExtension compressionExtension =
74+
new WebSocketPerMessageDeflateExtension(Deflater.BEST_COMPRESSION);
75+
compressionExtension.setThreshold(64);
76+
compressionExtension.setServerNoContextTakeover(false);
77+
compressionExtension.setClientNoContextTakeover(false);
78+
extensions.add(compressionExtension);
8079
}
8180
List<IProtocol> protocols = new ArrayList<>(protocolVersions.size());
8281
for (ProtocolVersion protocolVersion : protocolVersions) {

0 commit comments

Comments
 (0)