Call BlockingManager methods from QpackEncoder when decoder stream instructions arrive.
gfe-relnote: n/a, change to QUIC v99-only code. Protected by existing disabled gfe2_reloadable_flag_quic_enable_version_99.
PiperOrigin-RevId: 263348337
Change-Id: I038980c82747e7b25e1af273697531519ca6fac8
diff --git a/quic/core/qpack/qpack_encoder.cc b/quic/core/qpack/qpack_encoder.cc
index ddceef0..b6be648 100644
--- a/quic/core/qpack/qpack_encoder.cc
+++ b/quic/core/qpack/qpack_encoder.cc
@@ -12,6 +12,7 @@
#include "net/third_party/quiche/src/quic/core/qpack/value_splitting_header_list.h"
#include "net/third_party/quiche/src/quic/platform/api/quic_logging.h"
#include "net/third_party/quiche/src/quic/platform/api/quic_ptr_util.h"
+#include "net/third_party/quiche/src/quic/platform/api/quic_str_cat.h"
namespace quic {
@@ -120,16 +121,35 @@
maximum_blocked_streams_ = maximum_blocked_streams;
}
-void QpackEncoder::OnInsertCountIncrement(uint64_t /*increment*/) {
- // TODO(bnc): Implement dynamic table management for encoding.
+void QpackEncoder::OnInsertCountIncrement(uint64_t increment) {
+ if (increment == 0) {
+ decoder_stream_error_delegate_->OnDecoderStreamError(
+ "Invalid increment value 0.");
+ return;
+ }
+
+ blocking_manager_.OnInsertCountIncrement(increment);
+
+ if (blocking_manager_.known_received_count() >
+ header_table_.inserted_entry_count()) {
+ decoder_stream_error_delegate_->OnDecoderStreamError(QuicStrCat(
+ "Increment value ", increment, " raises known received count to ",
+ blocking_manager_.known_received_count(),
+ " exceeding inserted entry count ",
+ header_table_.inserted_entry_count()));
+ }
}
-void QpackEncoder::OnHeaderAcknowledgement(QuicStreamId /*stream_id*/) {
- // TODO(bnc): Implement dynamic table management for encoding.
+void QpackEncoder::OnHeaderAcknowledgement(QuicStreamId stream_id) {
+ if (!blocking_manager_.OnHeaderAcknowledgement(stream_id)) {
+ decoder_stream_error_delegate_->OnDecoderStreamError(
+ QuicStrCat("Header Acknowledgement received for stream ", stream_id,
+ " with no outstanding header blocks."));
+ }
}
-void QpackEncoder::OnStreamCancellation(QuicStreamId /*stream_id*/) {
- // TODO(bnc): Implement dynamic table management for encoding.
+void QpackEncoder::OnStreamCancellation(QuicStreamId stream_id) {
+ blocking_manager_.OnStreamCancellation(stream_id);
}
void QpackEncoder::OnErrorDetected(QuicStringPiece error_message) {
diff --git a/quic/core/qpack/qpack_encoder.h b/quic/core/qpack/qpack_encoder.h
index 1ced7fa..a1b6427 100644
--- a/quic/core/qpack/qpack_encoder.h
+++ b/quic/core/qpack/qpack_encoder.h
@@ -10,6 +10,7 @@
#include <string>
#include <vector>
+#include "net/third_party/quiche/src/quic/core/qpack/qpack_blocking_manager.h"
#include "net/third_party/quiche/src/quic/core/qpack/qpack_decoder_stream_receiver.h"
#include "net/third_party/quiche/src/quic/core/qpack/qpack_encoder_stream_sender.h"
#include "net/third_party/quiche/src/quic/core/qpack/qpack_header_table.h"
@@ -111,6 +112,7 @@
QpackEncoderStreamSender encoder_stream_sender_;
QpackHeaderTable header_table_;
uint64_t maximum_blocked_streams_;
+ QpackBlockingManager blocking_manager_;
};
} // namespace quic
diff --git a/quic/core/qpack/qpack_encoder_test.cc b/quic/core/qpack/qpack_encoder_test.cc
index bf5116e..56cfe84 100644
--- a/quic/core/qpack/qpack_encoder_test.cc
+++ b/quic/core/qpack/qpack_encoder_test.cc
@@ -152,6 +152,34 @@
output);
}
+TEST_F(QpackEncoderTest, ZeroInsertCountIncrement) {
+ // Encoder receives insert count increment with forbidden value 0.
+ EXPECT_CALL(decoder_stream_error_delegate_,
+ OnDecoderStreamError(Eq("Invalid increment value 0.")));
+ encoder_.OnInsertCountIncrement(0);
+}
+
+TEST_F(QpackEncoderTest, TooLargeInsertCountIncrement) {
+ // Encoder receives insert count increment with value that increases Known
+ // Received Count to a value (one) which is larger than the number of dynamic
+ // table insertions sent (zero).
+ EXPECT_CALL(
+ decoder_stream_error_delegate_,
+ OnDecoderStreamError(Eq("Increment value 1 raises known received count "
+ "to 1 exceeding inserted entry count 0")));
+ encoder_.OnInsertCountIncrement(1);
+}
+
+TEST_F(QpackEncoderTest, InvalidHeaderAcknowledgement) {
+ // Encoder receives header acknowledgement for a stream on which no header
+ // block with dynamic table entries was ever sent.
+ EXPECT_CALL(
+ decoder_stream_error_delegate_,
+ OnDecoderStreamError(Eq("Header Acknowledgement received for stream 0 "
+ "with no outstanding header blocks.")));
+ encoder_.OnHeaderAcknowledgement(/* stream_id = */ 0);
+}
+
} // namespace
} // namespace test
} // namespace quic