24
24
25
25
class SpdyHeaderBlockZlibEncoder extends SpdyHeaderBlockRawEncoder {
26
26
27
- private final byte [] out = new byte [8192 ];
28
27
private final Deflater compressor ;
29
28
30
29
private boolean finished ;
31
30
32
- SpdyHeaderBlockZlibEncoder (SpdyVersion version , int compressionLevel ) {
33
- super (version );
31
+ SpdyHeaderBlockZlibEncoder (SpdyVersion spdyVersion , int compressionLevel ) {
32
+ super (spdyVersion );
34
33
if (compressionLevel < 0 || compressionLevel > 9 ) {
35
34
throw new IllegalArgumentException (
36
35
"compressionLevel: " + compressionLevel + " (expected: 0-9)" );
@@ -39,20 +38,36 @@ class SpdyHeaderBlockZlibEncoder extends SpdyHeaderBlockRawEncoder {
39
38
compressor .setDictionary (SPDY_DICT );
40
39
}
41
40
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 ;
46
53
}
47
54
48
55
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 );
53
59
}
54
60
}
55
61
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
+
56
71
@ Override
57
72
public ByteBuf encode (SpdyHeadersFrame frame ) throws Exception {
58
73
if (frame == null ) {
@@ -68,9 +83,11 @@ public ByteBuf encode(SpdyHeadersFrame frame) throws Exception {
68
83
return Unpooled .EMPTY_BUFFER ;
69
84
}
70
85
71
- ByteBuf compressed = decompressed .alloc ().buffer ( );
72
- setInput (decompressed );
86
+ ByteBuf compressed = decompressed .alloc ().heapBuffer ( decompressed . readableBytes () );
87
+ int len = setInput (decompressed );
73
88
encode (compressed );
89
+ decompressed .skipBytes (len );
90
+
74
91
return compressed ;
75
92
}
76
93
0 commit comments