Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(501)

Unified Diff: net/spdy/spdy_framer.cc

Issue 292543002: Lazily alloc/init the HPACK encoder/decoder. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: nullptr => NULL Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « net/spdy/spdy_framer.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « net/spdy/spdy_framer.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698