Deprecate --gfe2_reloadable_flag_quic_validate_header_field_value_at_spdy_stream.
PiperOrigin-RevId: 474085897
diff --git a/quiche/quic/core/http/quic_spdy_stream.cc b/quiche/quic/core/http/quic_spdy_stream.cc
index bce3722..44de84c 100644
--- a/quiche/quic/core/http/quic_spdy_stream.cc
+++ b/quiche/quic/core/http/quic_spdy_stream.cc
@@ -625,8 +625,6 @@
: header_list.empty();
if (!AreHeaderFieldValuesValid(header_list)) {
OnInvalidHeaders();
- QUIC_RELOADABLE_FLAG_COUNT_N(
- quic_validate_header_field_value_at_spdy_stream, 2, 2);
return;
}
// Validate request headers if it did not exceed size limit. If it did,
@@ -1571,12 +1569,9 @@
bool QuicSpdyStream::AreHeaderFieldValuesValid(
const QuicHeaderList& header_list) const {
- if (!GetQuicReloadableFlag(quic_validate_header_field_value_at_spdy_stream) ||
- !VersionUsesHttp3(transport_version())) {
+ if (!VersionUsesHttp3(transport_version())) {
return true;
}
- QUIC_RELOADABLE_FLAG_COUNT_N(quic_validate_header_field_value_at_spdy_stream,
- 1, 2);
// According to https://www.rfc-editor.org/rfc/rfc9114.html#section-10.3
// "[...] HTTP/3 can transport field values that are not valid. While most
// values that can be encoded will not alter field parsing, carriage return
diff --git a/quiche/quic/core/qpack/qpack_decoder_test.cc b/quiche/quic/core/qpack/qpack_decoder_test.cc
index ecf3a17..5cfd960 100644
--- a/quiche/quic/core/qpack/qpack_decoder_test.cc
+++ b/quiche/quic/core/qpack/qpack_decoder_test.cc
@@ -223,15 +223,8 @@
}
TEST_P(QpackDecoderTest, LineFeedInValue) {
- if (!GetQuicReloadableFlag(quic_validate_header_field_value_at_spdy_stream)) {
- EXPECT_CALL(handler_,
- OnDecodingErrorDetected(QUIC_INVALID_CHARACTER_IN_FIELD_VALUE,
- "Invalid character in field value."));
- } else {
- EXPECT_CALL(handler_, OnHeaderDecoded(Eq("foo"), Eq("ba\nr")));
- EXPECT_CALL(handler_, OnDecodingCompleted());
- }
-
+ EXPECT_CALL(handler_, OnHeaderDecoded(Eq("foo"), Eq("ba\nr")));
+ EXPECT_CALL(handler_, OnDecodingCompleted());
DecodeHeaderBlock(absl::HexStringToBytes("000023666f6f0462610a72"));
}
diff --git a/quiche/quic/core/qpack/qpack_progressive_decoder.cc b/quiche/quic/core/qpack/qpack_progressive_decoder.cc
index feea62a..5dc5a68 100644
--- a/quiche/quic/core/qpack/qpack_progressive_decoder.cc
+++ b/quiche/quic/core/qpack/qpack_progressive_decoder.cc
@@ -339,31 +339,9 @@
return true;
}
-bool QpackProgressiveDecoder::OnHeaderDecoded(bool value_from_static_table,
+bool QpackProgressiveDecoder::OnHeaderDecoded(bool /*value_from_static_table*/,
absl::string_view name,
absl::string_view value) {
- if (!GetQuicReloadableFlag(quic_validate_header_field_value_at_spdy_stream)) {
- // Skip test for static table entries as they are all known to be valid.
- if (!value_from_static_table) {
- // According to Section 10.3 of
- // https://quicwg.org/base-drafts/draft-ietf-quic-http.html,
- // "[...] HTTP/3 can transport field values that are not valid. While most
- // values that can be encoded will not alter field parsing, carriage
- // return (CR, ASCII 0x0d), line feed (LF, ASCII 0x0a), and the zero
- // character (NUL, ASCII 0x00) might be exploited by an attacker if they
- // are translated verbatim. Any request or response that contains a
- // character not permitted in a field value MUST be treated as malformed
- // [...]"
- for (const auto c : value) {
- if (c == '\0' || c == '\n' || c == '\r') {
- OnError(QUIC_INVALID_CHARACTER_IN_FIELD_VALUE,
- "Invalid character in field value.");
- return false;
- }
- }
- }
- }
-
handler_->OnHeaderDecoded(name, value);
return true;
}
diff --git a/quiche/quic/core/quic_flags_list.h b/quiche/quic/core/quic_flags_list.h
index 8f7828c..7c99e37 100644
--- a/quiche/quic/core/quic_flags_list.h
+++ b/quiche/quic/core/quic_flags_list.h
@@ -87,8 +87,6 @@
QUIC_FLAG(quic_reloadable_flag_quic_connection_migration_use_new_cid_v2, true)
// If true, uses conservative cwnd gain and pacing gain when cwnd gets bootstrapped.
QUIC_FLAG(quic_reloadable_flag_quic_conservative_cwnd_and_pacing_gains, false)
-// If true, validate header field character at spdy stream instead of qpack for IETF QUIC.
-QUIC_FLAG(quic_reloadable_flag_quic_validate_header_field_value_at_spdy_stream, true)
// QuicConnection uses a library to generate connection IDs
QUIC_FLAG(quic_reloadable_flag_quic_connection_uses_abstract_connection_id_generator, false)
// QuicDispatcher uses a library to generate connection IDs
diff --git a/quiche/quic/tools/quic_simple_server_stream_test.cc b/quiche/quic/tools/quic_simple_server_stream_test.cc
index 1702ea1..69851f2 100644
--- a/quiche/quic/tools/quic_simple_server_stream_test.cc
+++ b/quiche/quic/tools/quic_simple_server_stream_test.cc
@@ -703,8 +703,7 @@
// \000 is a way to write the null byte when followed by a literal digit.
header_list_.OnHeader("content-length", absl::string_view("11\00012", 5));
- if (GetQuicReloadableFlag(quic_validate_header_field_value_at_spdy_stream) &&
- session_.version().UsesHttp3()) {
+ if (session_.version().UsesHttp3()) {
EXPECT_CALL(session_,
MaybeSendStopSendingFrame(_, QuicResetStreamError::FromInternal(
QUIC_STREAM_NO_ERROR)));
@@ -725,8 +724,7 @@
// \000 is a way to write the null byte when followed by a literal digit.
header_list_.OnHeader("content-length", absl::string_view("\00012", 3));
- if (GetQuicReloadableFlag(quic_validate_header_field_value_at_spdy_stream) &&
- session_.version().UsesHttp3()) {
+ if (session_.version().UsesHttp3()) {
EXPECT_CALL(session_,
MaybeSendStopSendingFrame(_, QuicResetStreamError::FromInternal(
QUIC_STREAM_NO_ERROR)));
@@ -747,8 +745,7 @@
// \000 is a way to write the null byte when followed by a literal digit.
header_list_.OnHeader("content-length", absl::string_view("11\00011", 5));
- if (GetQuicReloadableFlag(quic_validate_header_field_value_at_spdy_stream) &&
- session_.version().UsesHttp3()) {
+ if (session_.version().UsesHttp3()) {
EXPECT_CALL(session_,
MaybeSendStopSendingFrame(_, QuicResetStreamError::FromInternal(
QUIC_STREAM_NO_ERROR)));
@@ -760,8 +757,7 @@
stream_->OnStreamHeaderList(false, kFakeFrameLen, header_list_);
- if (GetQuicReloadableFlag(quic_validate_header_field_value_at_spdy_stream) &&
- session_.version().UsesHttp3()) {
+ if (session_.version().UsesHttp3()) {
EXPECT_TRUE(QuicStreamPeer::read_side_closed(stream_));
EXPECT_TRUE(stream_->reading_stopped());
EXPECT_TRUE(stream_->write_side_closed());