Skip to content

Commit ad70e69

Browse files
committed
Port the changes in SpdyHeaderBlockZlibEncoder to master & 4.0
Somehow it slipped away.
1 parent e1ab46f commit ad70e69

File tree

1 file changed

+30
-13
lines changed

1 file changed

+30
-13
lines changed

codec-http/src/main/java/io/netty/handler/codec/spdy/SpdyHeaderBlockZlibEncoder.java

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,12 @@
2424

2525
class SpdyHeaderBlockZlibEncoder extends SpdyHeaderBlockRawEncoder {
2626

27-
private final byte[] out = new byte[8192];
2827
private final Deflater compressor;
2928

3029
private boolean finished;
3130

32-
SpdyHeaderBlockZlibEncoder(SpdyVersion version, int compressionLevel) {
33-
super(version);
31+
SpdyHeaderBlockZlibEncoder(SpdyVersion spdyVersion, int compressionLevel) {
32+
super(spdyVersion);
3433
if (compressionLevel < 0 || compressionLevel > 9) {
3534
throw new IllegalArgumentException(
3635
"compressionLevel: " + compressionLevel + " (expected: 0-9)");
@@ -39,20 +38,36 @@ class SpdyHeaderBlockZlibEncoder extends SpdyHeaderBlockRawEncoder {
3938
compressor.setDictionary(SPDY_DICT);
4039
}
4140

42-
private void setInput(ByteBuf decompressed) {
43-
byte[] in = new byte[decompressed.readableBytes()];
44-
decompressed.readBytes(in);
45-
compressor.setInput(in);
41+
private int setInput(ByteBuf decompressed) {
42+
int len = decompressed.readableBytes();
43+
44+
if (decompressed.hasArray()) {
45+
compressor.setInput(decompressed.array(), decompressed.arrayOffset() + decompressed.readerIndex(), len);
46+
} else {
47+
byte[] in = new byte[len];
48+
decompressed.getBytes(decompressed.readerIndex(), in);
49+
compressor.setInput(in, 0, in.length);
50+
}
51+
52+
return len;
4653
}
4754

4855
private void encode(ByteBuf compressed) {
49-
int numBytes = out.length;
50-
while (numBytes == out.length) {
51-
numBytes = compressor.deflate(out, 0, out.length, Deflater.SYNC_FLUSH);
52-
compressed.writeBytes(out, 0, numBytes);
56+
while (compressInto(compressed)) {
57+
// Although unlikely, it's possible that the compressed size is larger than the decompressed size
58+
compressed.ensureWritable(compressed.capacity() << 1);
5359
}
5460
}
5561

62+
private boolean compressInto(ByteBuf compressed) {
63+
byte[] out = compressed.array();
64+
int off = compressed.arrayOffset() + compressed.writerIndex();
65+
int toWrite = compressed.writableBytes();
66+
int numBytes = compressor.deflate(out, off, toWrite, Deflater.SYNC_FLUSH);
67+
compressed.writerIndex(compressed.writerIndex() + numBytes);
68+
return numBytes == toWrite;
69+
}
70+
5671
@Override
5772
public ByteBuf encode(SpdyHeadersFrame frame) throws Exception {
5873
if (frame == null) {
@@ -68,9 +83,11 @@ public ByteBuf encode(SpdyHeadersFrame frame) throws Exception {
6883
return Unpooled.EMPTY_BUFFER;
6984
}
7085

71-
ByteBuf compressed = decompressed.alloc().buffer();
72-
setInput(decompressed);
86+
ByteBuf compressed = decompressed.alloc().heapBuffer(decompressed.readableBytes());
87+
int len = setInput(decompressed);
7388
encode(compressed);
89+
decompressed.skipBytes(len);
90+
7491
return compressed;
7592
}
7693

0 commit comments

Comments
 (0)