1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.jboss.netty.handler.codec.spdy;
17
18 import static org.jboss.netty.handler.codec.spdy.SpdyCodecUtil.*;
19
20 import java.util.zip.DataFormatException;
21 import java.util.zip.Inflater;
22
23 import org.jboss.netty.buffer.ChannelBuffer;
24
25 class SpdyHeaderBlockZlibDecompressor extends SpdyHeaderBlockDecompressor {
26
27 private final int version;
28 private final byte[] out = new byte[8192];
29 private final Inflater decompressor = new Inflater();
30
31 public SpdyHeaderBlockZlibDecompressor(int version) {
32 if (version < SPDY_MIN_VERSION || version > SPDY_MAX_VERSION) {
33 throw new IllegalArgumentException(
34 "unsupported version: " + version);
35 }
36 this.version = version;
37 }
38
39 @Override
40 public void setInput(ChannelBuffer compressed) {
41 byte[] in = new byte[compressed.readableBytes()];
42 compressed.readBytes(in);
43 decompressor.setInput(in);
44 }
45
46 @Override
47 public int decode(ChannelBuffer decompressed) throws Exception {
48 try {
49 int numBytes = decompressor.inflate(out);
50 if (numBytes == 0 && decompressor.needsDictionary()) {
51 if (version < 3) {
52 decompressor.setDictionary(SPDY2_DICT);
53 } else {
54 decompressor.setDictionary(SPDY_DICT);
55 }
56 numBytes = decompressor.inflate(out);
57 }
58 decompressed.writeBytes(out, 0, numBytes);
59 return numBytes;
60 } catch (DataFormatException e) {
61 throw new SpdyProtocolException(
62 "Received invalid header block", e);
63 }
64 }
65
66 @Override
67 public void end() {
68 decompressor.end();
69 }
70 }