| Index: net/spdy/spdy_framer.cc
|
| diff --git a/net/spdy/spdy_framer.cc b/net/spdy/spdy_framer.cc
|
| index 73aa53299ce8bc418cd8a4f8909e7e4d861217ee..a1287bd9b7f711ee3eb5f043fe1f473ed61bcea6 100644
|
| --- a/net/spdy/spdy_framer.cc
|
| +++ b/net/spdy/spdy_framer.cc
|
| @@ -134,12 +134,6 @@ SpdyFramer::SpdyFramer(SpdyMajorVersion version)
|
| DCHECK_GE(spdy_version_, SPDY_MIN_VERSION);
|
| DCHECK_LE(spdy_version_, SPDY_MAX_VERSION);
|
| Reset();
|
| -
|
| - // SPDY4 and up use HPACK. Allocate instances for these protocol versions.
|
| - if (spdy_version_ > SPDY3) {
|
| - hpack_encoder_.reset(new HpackEncoder(ObtainHpackHuffmanTable()));
|
| - hpack_decoder_.reset(new HpackDecoder(ObtainHpackHuffmanTable()));
|
| - }
|
| }
|
|
|
| SpdyFramer::~SpdyFramer() {
|
| @@ -1481,9 +1475,8 @@ size_t SpdyFramer::ProcessControlFrameHeaderBlock(const char* data,
|
| }
|
| size_t process_bytes = std::min(data_len, remaining_data_length_);
|
| if (is_hpack_header_block) {
|
| - if (!hpack_decoder_->HandleControlFrameHeadersData(current_frame_stream_id_,
|
| - data,
|
| - process_bytes)) {
|
| + if (!GetHpackDecoder()->HandleControlFrameHeadersData(
|
| + current_frame_stream_id_, data, process_bytes)) {
|
| // TODO(jgraettinger): Finer-grained HPACK error codes.
|
| set_error(SPDY_DECOMPRESS_FAILURE);
|
| processed_successfully = false;
|
| @@ -1503,8 +1496,8 @@ size_t SpdyFramer::ProcessControlFrameHeaderBlock(const char* data,
|
| if (remaining_data_length_ == 0 && processed_successfully) {
|
| if (expect_continuation_ == 0) {
|
| if (is_hpack_header_block) {
|
| - if (!hpack_decoder_->HandleControlFrameHeadersComplete(
|
| - current_frame_stream_id_)) {
|
| + if (!GetHpackDecoder()->HandleControlFrameHeadersComplete(
|
| + current_frame_stream_id_)) {
|
| set_error(SPDY_DECOMPRESS_FAILURE);
|
| processed_successfully = false;
|
| } else {
|
| @@ -1599,7 +1592,7 @@ void SpdyFramer::DeliverHpackBlockAsSpdy3Block() {
|
| DCHECK_LT(SPDY3, protocol_version());
|
| DCHECK_EQ(0u, remaining_data_length_);
|
|
|
| - const SpdyNameValueBlock& block = hpack_decoder_->decoded_block();
|
| + const SpdyNameValueBlock& block = GetHpackDecoder()->decoded_block();
|
| if (block.empty()) {
|
| // Special-case this to make tests happy.
|
| ProcessControlFrameHeaderBlock(NULL, 0, false);
|
| @@ -2148,10 +2141,10 @@ SpdySerializedFrame* SpdyFramer::SerializeSynStream(
|
| string hpack_encoding;
|
| if (protocol_version() > SPDY3) {
|
| if (enable_compression_) {
|
| - hpack_encoder_->EncodeHeaderSet(
|
| + GetHpackEncoder()->EncodeHeaderSet(
|
| syn_stream.name_value_block(), &hpack_encoding);
|
| } else {
|
| - hpack_encoder_->EncodeHeaderSetWithoutCompression(
|
| + GetHpackEncoder()->EncodeHeaderSetWithoutCompression(
|
| syn_stream.name_value_block(), &hpack_encoding);
|
| }
|
| size += hpack_encoding.size();
|
| @@ -2213,10 +2206,10 @@ SpdySerializedFrame* SpdyFramer::SerializeSynReply(
|
| string hpack_encoding;
|
| if (protocol_version() > SPDY3) {
|
| if (enable_compression_) {
|
| - hpack_encoder_->EncodeHeaderSet(
|
| + GetHpackEncoder()->EncodeHeaderSet(
|
| syn_reply.name_value_block(), &hpack_encoding);
|
| } else {
|
| - hpack_encoder_->EncodeHeaderSetWithoutCompression(
|
| + GetHpackEncoder()->EncodeHeaderSetWithoutCompression(
|
| syn_reply.name_value_block(), &hpack_encoding);
|
| }
|
| size += hpack_encoding.size();
|
| @@ -2433,10 +2426,10 @@ SpdySerializedFrame* SpdyFramer::SerializeHeaders(
|
| string hpack_encoding;
|
| if (protocol_version() > SPDY3) {
|
| if (enable_compression_) {
|
| - hpack_encoder_->EncodeHeaderSet(
|
| + GetHpackEncoder()->EncodeHeaderSet(
|
| headers.name_value_block(), &hpack_encoding);
|
| } else {
|
| - hpack_encoder_->EncodeHeaderSetWithoutCompression(
|
| + GetHpackEncoder()->EncodeHeaderSetWithoutCompression(
|
| headers.name_value_block(), &hpack_encoding);
|
| }
|
| size += hpack_encoding.size();
|
| @@ -2526,10 +2519,10 @@ SpdyFrame* SpdyFramer::SerializePushPromise(
|
| string hpack_encoding;
|
| if (protocol_version() > SPDY3) {
|
| if (enable_compression_) {
|
| - hpack_encoder_->EncodeHeaderSet(
|
| + GetHpackEncoder()->EncodeHeaderSet(
|
| push_promise.name_value_block(), &hpack_encoding);
|
| } else {
|
| - hpack_encoder_->EncodeHeaderSetWithoutCompression(
|
| + GetHpackEncoder()->EncodeHeaderSetWithoutCompression(
|
| push_promise.name_value_block(), &hpack_encoding);
|
| }
|
| size += hpack_encoding.size();
|
| @@ -2586,10 +2579,10 @@ SpdyFrame* SpdyFramer::SerializeContinuation(
|
| size_t size = GetContinuationMinimumSize();
|
| string hpack_encoding;
|
| if (enable_compression_) {
|
| - hpack_encoder_->EncodeHeaderSet(
|
| + GetHpackEncoder()->EncodeHeaderSet(
|
| continuation.name_value_block(), &hpack_encoding);
|
| } else {
|
| - hpack_encoder_->EncodeHeaderSetWithoutCompression(
|
| + GetHpackEncoder()->EncodeHeaderSetWithoutCompression(
|
| continuation.name_value_block(), &hpack_encoding);
|
| }
|
| size += hpack_encoding.size();
|
| @@ -2808,6 +2801,22 @@ z_stream* SpdyFramer::GetHeaderDecompressor() {
|
| return header_decompressor_.get();
|
| }
|
|
|
| +HpackEncoder* SpdyFramer::GetHpackEncoder() {
|
| + DCHECK_LT(SPDY3, spdy_version_);
|
| + if (hpack_encoder_.get() == NULL) {
|
| + hpack_encoder_.reset(new HpackEncoder(ObtainHpackHuffmanTable()));
|
| + }
|
| + return hpack_encoder_.get();
|
| +}
|
| +
|
| +HpackDecoder* SpdyFramer::GetHpackDecoder() {
|
| + DCHECK_LT(SPDY3, spdy_version_);
|
| + if (hpack_decoder_.get() == NULL) {
|
| + hpack_decoder_.reset(new HpackDecoder(ObtainHpackHuffmanTable()));
|
| + }
|
| + return hpack_decoder_.get();
|
| +}
|
| +
|
| // Incrementally decompress the control frame's header block, feeding the
|
| // result to the visitor in chunks. Continue this until the visitor
|
| // indicates that it cannot process any more data, or (more commonly) we
|
|
|