Add knobs to QuicSpdySession for QPACK maximum table capacity and blocked stream limit. gfe-relnote: n/a, change to QUIC v99-only code. Protected by existing disabled gfe2_reloadable_flag_quic_enable_version_99. PiperOrigin-RevId: 265048552 Change-Id: Iab652cf6a0578d56a7e1d4cd7eb6cf1b7f562f60
diff --git a/quic/core/http/quic_spdy_session.cc b/quic/core/http/quic_spdy_session.cc index dd9b4f4..08ff7e6 100644 --- a/quic/core/http/quic_spdy_session.cc +++ b/quic/core/http/quic_spdy_session.cc
@@ -318,6 +318,9 @@ qpack_decoder_receive_stream_(nullptr), qpack_encoder_send_stream_(nullptr), qpack_decoder_send_stream_(nullptr), + qpack_maximum_dynamic_table_capacity_( + kDefaultQpackMaxDynamicTableCapacity), + qpack_maximum_blocked_streams_(kDefaultMaximumBlockedStreams), max_inbound_header_list_size_(kDefaultMaxUncompressedHeaderSize), max_outbound_header_list_size_(kDefaultMaxUncompressedHeaderSize), server_push_enabled_(true), @@ -379,12 +382,12 @@ } else { qpack_encoder_ = QuicMakeUnique<QpackEncoder>(this); qpack_decoder_ = - QuicMakeUnique<QpackDecoder>(kDefaultQpackMaxDynamicTableCapacity, - kDefaultMaximumBlockedStreams, this); + QuicMakeUnique<QpackDecoder>(qpack_maximum_dynamic_table_capacity_, + qpack_maximum_blocked_streams_, this); MaybeInitializeHttp3UnidirectionalStreams(); // TODO(b/112770235): Send SETTINGS_QPACK_MAX_TABLE_CAPACITY with value - // kDefaultQpackMaxDynamicTableCapacity, and SETTINGS_QPACK_BLOCKED_STREAMS - // with value kDefaultMaximumBlockedStreams. + // qpack_maximum_dynamic_table_capacity_, and SETTINGS_QPACK_BLOCKED_STREAMS + // with value qpack_maximum_blocked_streams_. } spdy_framer_visitor_->set_max_header_list_size(max_inbound_header_list_size_); @@ -680,6 +683,8 @@ QUIC_DVLOG(1) << "SETTINGS_QPACK_MAX_TABLE_CAPACITY received with value " << value; + // TODO(b/112770235): Limit value to + // qpack_maximum_dynamic_table_capacity_. qpack_encoder_->SetMaximumDynamicTableCapacity(value); break; case SETTINGS_MAX_HEADER_LIST_SIZE:
diff --git a/quic/core/http/quic_spdy_session.h b/quic/core/http/quic_spdy_session.h index e16e09a..0ee3632 100644 --- a/quic/core/http/quic_spdy_session.h +++ b/quic/core/http/quic_spdy_session.h
@@ -155,7 +155,22 @@ void CloseConnectionWithDetails(QuicErrorCode error, const std::string& details); - // Must be called before Initialize(). + // Must not be called after Initialize(). + // TODO(bnc): Move to constructor argument. + void set_qpack_maximum_dynamic_table_capacity( + uint64_t qpack_maximum_dynamic_table_capacity) { + qpack_maximum_dynamic_table_capacity_ = + qpack_maximum_dynamic_table_capacity; + } + + // Must not be called after Initialize(). + // TODO(bnc): Move to constructor argument. + void set_qpack_maximum_blocked_streams( + uint64_t qpack_maximum_blocked_streams) { + qpack_maximum_blocked_streams_ = qpack_maximum_blocked_streams; + } + + // Must not be called after Initialize(). // TODO(bnc): Move to constructor argument. void set_max_inbound_header_list_size(size_t max_inbound_header_list_size) { max_inbound_header_list_size_ = max_inbound_header_list_size; @@ -302,8 +317,21 @@ QpackSendStream* qpack_encoder_send_stream_; QpackSendStream* qpack_decoder_send_stream_; + // Maximum dynamic table capacity as defined at + // https://quicwg.org/base-drafts/draft-ietf-quic-qpack.html#maximum-dynamic-table-capacity + // for the decoding context. Value will be sent via + // SETTINGS_QPACK_MAX_TABLE_CAPACITY. + uint64_t qpack_maximum_dynamic_table_capacity_; + + // Maximum number of blocked streams as defined at + // https://quicwg.org/base-drafts/draft-ietf-quic-qpack.html#blocked-streams + // for the decoding context. Value will be sent via + // SETTINGS_QPACK_BLOCKED_STREAMS. + uint64_t qpack_maximum_blocked_streams_; + // The maximum size of a header block that will be accepted from the peer, // defined per spec as key + value + overhead per field (uncompressed). + // Value will be sent via SETTINGS_MAX_HEADER_LIST_SIZE. size_t max_inbound_header_list_size_; // The maximum size of a header block that can be sent to the peer. This field