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 |