| Index: net/spdy/spdy_framer.cc
|
| diff --git a/net/spdy/spdy_framer.cc b/net/spdy/spdy_framer.cc
|
| index 3d9994013171b787a6bccba0d1e64144b62baecb..73aa53299ce8bc418cd8a4f8909e7e4d861217ee 100644
|
| --- a/net/spdy/spdy_framer.cc
|
| +++ b/net/spdy/spdy_framer.cc
|
| @@ -123,8 +123,6 @@ bool SpdyFramerVisitorInterface::OnRstStreamFrameData(
|
| SpdyFramer::SpdyFramer(SpdyMajorVersion version)
|
| : current_frame_buffer_(new char[kControlFrameBufferSize]),
|
| enable_compression_(true),
|
| - hpack_encoder_(ObtainHpackHuffmanTable()),
|
| - hpack_decoder_(ObtainHpackHuffmanTable()),
|
| visitor_(NULL),
|
| debug_visitor_(NULL),
|
| display_protocol_("SPDY"),
|
| @@ -136,6 +134,12 @@ 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() {
|
| @@ -1477,9 +1481,9 @@ 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 (!hpack_decoder_->HandleControlFrameHeadersData(current_frame_stream_id_,
|
| + data,
|
| + process_bytes)) {
|
| // TODO(jgraettinger): Finer-grained HPACK error codes.
|
| set_error(SPDY_DECOMPRESS_FAILURE);
|
| processed_successfully = false;
|
| @@ -1499,7 +1503,7 @@ 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(
|
| + if (!hpack_decoder_->HandleControlFrameHeadersComplete(
|
| current_frame_stream_id_)) {
|
| set_error(SPDY_DECOMPRESS_FAILURE);
|
| processed_successfully = false;
|
| @@ -1595,7 +1599,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 = hpack_decoder_->decoded_block();
|
| if (block.empty()) {
|
| // Special-case this to make tests happy.
|
| ProcessControlFrameHeaderBlock(NULL, 0, false);
|
| @@ -2144,10 +2148,10 @@ SpdySerializedFrame* SpdyFramer::SerializeSynStream(
|
| string hpack_encoding;
|
| if (protocol_version() > SPDY3) {
|
| if (enable_compression_) {
|
| - hpack_encoder_.EncodeHeaderSet(
|
| + hpack_encoder_->EncodeHeaderSet(
|
| syn_stream.name_value_block(), &hpack_encoding);
|
| } else {
|
| - hpack_encoder_.EncodeHeaderSetWithoutCompression(
|
| + hpack_encoder_->EncodeHeaderSetWithoutCompression(
|
| syn_stream.name_value_block(), &hpack_encoding);
|
| }
|
| size += hpack_encoding.size();
|
| @@ -2209,10 +2213,10 @@ SpdySerializedFrame* SpdyFramer::SerializeSynReply(
|
| string hpack_encoding;
|
| if (protocol_version() > SPDY3) {
|
| if (enable_compression_) {
|
| - hpack_encoder_.EncodeHeaderSet(
|
| + hpack_encoder_->EncodeHeaderSet(
|
| syn_reply.name_value_block(), &hpack_encoding);
|
| } else {
|
| - hpack_encoder_.EncodeHeaderSetWithoutCompression(
|
| + hpack_encoder_->EncodeHeaderSetWithoutCompression(
|
| syn_reply.name_value_block(), &hpack_encoding);
|
| }
|
| size += hpack_encoding.size();
|
| @@ -2429,10 +2433,10 @@ SpdySerializedFrame* SpdyFramer::SerializeHeaders(
|
| string hpack_encoding;
|
| if (protocol_version() > SPDY3) {
|
| if (enable_compression_) {
|
| - hpack_encoder_.EncodeHeaderSet(
|
| + hpack_encoder_->EncodeHeaderSet(
|
| headers.name_value_block(), &hpack_encoding);
|
| } else {
|
| - hpack_encoder_.EncodeHeaderSetWithoutCompression(
|
| + hpack_encoder_->EncodeHeaderSetWithoutCompression(
|
| headers.name_value_block(), &hpack_encoding);
|
| }
|
| size += hpack_encoding.size();
|
| @@ -2522,10 +2526,10 @@ SpdyFrame* SpdyFramer::SerializePushPromise(
|
| string hpack_encoding;
|
| if (protocol_version() > SPDY3) {
|
| if (enable_compression_) {
|
| - hpack_encoder_.EncodeHeaderSet(
|
| + hpack_encoder_->EncodeHeaderSet(
|
| push_promise.name_value_block(), &hpack_encoding);
|
| } else {
|
| - hpack_encoder_.EncodeHeaderSetWithoutCompression(
|
| + hpack_encoder_->EncodeHeaderSetWithoutCompression(
|
| push_promise.name_value_block(), &hpack_encoding);
|
| }
|
| size += hpack_encoding.size();
|
| @@ -2582,10 +2586,10 @@ SpdyFrame* SpdyFramer::SerializeContinuation(
|
| size_t size = GetContinuationMinimumSize();
|
| string hpack_encoding;
|
| if (enable_compression_) {
|
| - hpack_encoder_.EncodeHeaderSet(
|
| + hpack_encoder_->EncodeHeaderSet(
|
| continuation.name_value_block(), &hpack_encoding);
|
| } else {
|
| - hpack_encoder_.EncodeHeaderSetWithoutCompression(
|
| + hpack_encoder_->EncodeHeaderSetWithoutCompression(
|
| continuation.name_value_block(), &hpack_encoding);
|
| }
|
| size += hpack_encoding.size();
|
|
|