Updates spdy::Http2DecoderAdapter to hold HpackDecoderAdapter directly, rather than as a pointer. This may very slightly improve memory usage and performance. Protected by not protected: minor refactoring, no functional change. PiperOrigin-RevId: 596076512
diff --git a/quiche/http2/adapter/oghttp2_session.cc b/quiche/http2/adapter/oghttp2_session.cc index d91d9dc..18a87d1 100644 --- a/quiche/http2/adapter/oghttp2_session.cc +++ b/quiche/http2/adapter/oghttp2_session.cc
@@ -353,10 +353,10 @@ decoder_.set_visitor(&receive_logger_); if (options_.max_header_list_bytes) { // Limit buffering of encoded HPACK data to 2x the decoded limit. - decoder_.GetHpackDecoder()->set_max_decode_buffer_size_bytes( + decoder_.GetHpackDecoder().set_max_decode_buffer_size_bytes( 2 * *options_.max_header_list_bytes); // Limit the total bytes accepted for HPACK decoding to 4x the limit. - decoder_.GetHpackDecoder()->set_max_header_block_bytes( + decoder_.GetHpackDecoder().set_max_header_block_bytes( 4 * *options_.max_header_list_bytes); } if (IsServerSession()) { @@ -442,13 +442,11 @@ } int OgHttp2Session::GetHpackDecoderDynamicTableSize() const { - const spdy::HpackDecoderAdapter* decoder = decoder_.GetHpackDecoder(); - return decoder == nullptr ? 0 : decoder->GetDynamicTableSize(); + return decoder_.GetHpackDecoder().GetDynamicTableSize(); } int OgHttp2Session::GetHpackDecoderSizeLimit() const { - const spdy::HpackDecoderAdapter* decoder = decoder_.GetHpackDecoder(); - return decoder == nullptr ? 0 : decoder->GetCurrentHeaderTableSizeSetting(); + return decoder_.GetHpackDecoder().GetCurrentHeaderTableSizeSetting(); } int64_t OgHttp2Session::ProcessBytes(absl::string_view bytes) { @@ -1698,7 +1696,7 @@ max_inbound_concurrent_streams_ = value; break; case HEADER_TABLE_SIZE: - decoder_.GetHpackDecoder()->ApplyHeaderTableSizeSetting(value); + decoder_.GetHpackDecoder().ApplyHeaderTableSizeSetting(value); break; case INITIAL_WINDOW_SIZE: UpdateStreamReceiveWindowSizes(value);
diff --git a/quiche/quic/core/http/quic_spdy_session.cc b/quiche/quic/core/http/quic_spdy_session.cc index 9a937c7..d88951a 100644 --- a/quiche/quic/core/http/quic_spdy_session.cc +++ b/quiche/quic/core/http/quic_spdy_session.cc
@@ -532,7 +532,7 @@ spdy_framer_visitor_->set_max_header_list_size(max_inbound_header_list_size_); // Limit HPACK buffering to 2x header list size limit. - h2_deframer_.GetHpackDecoder()->set_max_decode_buffer_size_bytes( + h2_deframer_.GetHpackDecoder().set_max_decode_buffer_size_bytes( 2 * max_inbound_header_list_size_); }
diff --git a/quiche/spdy/core/http2_frame_decoder_adapter.cc b/quiche/spdy/core/http2_frame_decoder_adapter.cc index fcbc79f..58cf162 100644 --- a/quiche/spdy/core/http2_frame_decoder_adapter.cc +++ b/quiche/spdy/core/http2_frame_decoder_adapter.cc
@@ -472,10 +472,10 @@ void Http2DecoderAdapter::OnHpackFragment(const char* data, size_t len) { QUICHE_DVLOG(1) << "OnHpackFragment: len=" << len; on_hpack_fragment_called_ = true; - auto* decoder = GetHpackDecoder(); - if (!decoder->HandleControlFrameHeadersData(data, len)) { - SetSpdyErrorAndNotify(HpackDecodingErrorToSpdyFramerError(decoder->error()), - decoder->detailed_error()); + auto& decoder = GetHpackDecoder(); + if (!decoder.HandleControlFrameHeadersData(data, len)) { + SetSpdyErrorAndNotify(HpackDecodingErrorToSpdyFramerError(decoder.error()), + decoder.detailed_error()); return; } } @@ -1029,13 +1029,6 @@ } } -HpackDecoderAdapter* Http2DecoderAdapter::GetHpackDecoder() { - if (hpack_decoder_ == nullptr) { - hpack_decoder_ = std::make_unique<HpackDecoderAdapter>(); - } - return hpack_decoder_.get(); -} - void Http2DecoderAdapter::CommonStartHpackBlock() { QUICHE_DVLOG(1) << "CommonStartHpackBlock"; QUICHE_DCHECK(!has_hpack_first_frame_header_); @@ -1053,7 +1046,7 @@ SetSpdyErrorAndNotify(SpdyFramerError::SPDY_INTERNAL_FRAMER_ERROR, ""); return; } - GetHpackDecoder()->HandleControlFrameHeadersStart(handler); + GetHpackDecoder().HandleControlFrameHeadersStart(handler); } // SpdyFramer calls HandleControlFrameHeadersData even if there are zero @@ -1078,12 +1071,12 @@ frame_type() == Http2FrameType::CONTINUATION) << frame_header(); has_expected_frame_type_ = false; - auto* decoder = GetHpackDecoder(); - if (decoder->HandleControlFrameHeadersComplete()) { + auto& decoder = GetHpackDecoder(); + if (decoder.HandleControlFrameHeadersComplete()) { visitor()->OnHeaderFrameEnd(stream_id()); } else { SetSpdyErrorAndNotify( - HpackDecodingErrorToSpdyFramerError(decoder->error()), ""); + HpackDecodingErrorToSpdyFramerError(decoder.error()), ""); return; } const Http2FrameHeader& first = frame_type() == Http2FrameType::CONTINUATION
diff --git a/quiche/spdy/core/http2_frame_decoder_adapter.h b/quiche/spdy/core/http2_frame_decoder_adapter.h index 87ab4c5..fab2669 100644 --- a/quiche/spdy/core/http2_frame_decoder_adapter.h +++ b/quiche/spdy/core/http2_frame_decoder_adapter.h
@@ -154,9 +154,9 @@ // has responded with an HTTP/1.1 (or earlier) response. bool probable_http_response() const; - spdy::HpackDecoderAdapter* GetHpackDecoder(); - const spdy::HpackDecoderAdapter* GetHpackDecoder() const { - return hpack_decoder_.get(); + spdy::HpackDecoderAdapter& GetHpackDecoder() { return hpack_decoder_; } + const spdy::HpackDecoderAdapter& GetHpackDecoder() const { + return hpack_decoder_; } bool HasError() const; @@ -290,9 +290,8 @@ // If non-null, unknown frames and settings are passed to the extension. spdy::ExtensionVisitorInterface* extension_ = nullptr; - // The HPACK decoder to be used for this adapter. User is responsible for - // clearing if the adapter is to be used for another connection. - std::unique_ptr<spdy::HpackDecoderAdapter> hpack_decoder_; + // The HPACK decoder to be used for this adapter. + spdy::HpackDecoderAdapter hpack_decoder_; // The HTTP/2 frame decoder. Http2FrameDecoder frame_decoder_;