@@ -96,6 +96,8 @@ public class PerMessageDeflateExtension extends CompressionExtension {
9696 private boolean isDecompressorResetAllowed ;
9797 private boolean isCompressing ;
9898 private boolean isDecompressing ;
99+ private long compressedBytes ;
100+ private long decompressedBytes ;
99101
100102 public PerMessageDeflateExtension () {
101103 this (DEFAULT_COMPRESSION );
@@ -126,6 +128,8 @@ public PerMessageDeflateExtension(int compressionLevel, int maxFragmentSize) {
126128 isDecompressorResetAllowed = false ;
127129 isCompressing = false ;
128130 isDecompressing = false ;
131+ compressedBytes = 0 ;
132+ decompressedBytes = 0 ;
129133 }
130134
131135 public int getCompressionLevel () {
@@ -160,6 +164,21 @@ public void setServerNoContextTakeover(boolean serverNoContextTakeover) {
160164 this .serverNoContextTakeover = serverNoContextTakeover ;
161165 }
162166
167+ /**
168+ * Returns the overall compression ratio of all incoming and outgoing payloads which were
169+ * compressed.
170+ *
171+ * <p>Values below 1 mean the compression is effective, the lower, the better. If you get values
172+ * above 1, look into increasing the compression level or the threshold. If that does not help,
173+ * consider not using this extension.
174+ *
175+ * @return the overall compression ratio of all incoming and outgoing payloads
176+ */
177+ public double getCompressionRatio () {
178+ double decompressed = decompressedBytes ;
179+ return decompressed > 0 ? compressedBytes / decompressed : 1 ;
180+ }
181+
163182 @ Override
164183 public void isFrameValid (Framedata inputFrame ) throws InvalidDataException {
165184 // RFC 7692: RSV1 may only be set for the first fragment of a message
@@ -194,7 +213,9 @@ public void decodeFrame(Framedata inputFrame) throws InvalidDataException {
194213 // decompress the frame payload
195214 DataFrame dataFrame = (DataFrame ) inputFrame ;
196215 ByteBuffer payload = dataFrame .getPayloadData ();
216+ compressedBytes += payload .remaining ();
197217 byte [] decompressed = decompress (payload , dataFrame .isFin ());
218+ decompressedBytes += decompressed .length ;
198219 dataFrame .setPayload (ByteBuffer .wrap (decompressed ));
199220
200221 // payload is no longer compressed, clear the RFC 7692 compression marker RSV1
@@ -277,7 +298,9 @@ public void encodeFrame(Framedata inputFrame) {
277298 // compress the frame payload
278299 DataFrame dataFrame = (DataFrame ) inputFrame ;
279300 ByteBuffer payload = dataFrame .getPayloadData ();
301+ decompressedBytes += payload .remaining ();
280302 byte [] compressed = compress (payload , dataFrame .isFin ());
303+ compressedBytes += compressed .length ;
281304 dataFrame .setPayload (ByteBuffer .wrap (compressed ));
282305
283306 // payload is compressed now, set the RFC 7692 compression marker RSV1
@@ -545,9 +568,10 @@ public IExtension copyInstance() {
545568
546569 @ Override
547570 public void reset () {
548- super .reset ();
549571 isCompressing = false ;
550572 isDecompressing = false ;
573+ compressedBytes = 0 ;
574+ decompressedBytes = 0 ;
551575 }
552576
553577 @ Override
0 commit comments