Use HTTP/3 error code when unidirectional stream limit is too low. gfe-relnote: protected by gfe2_reloadable_flag_quic_enable_version_draft_25_v3 PiperOrigin-RevId: 308318955 Change-Id: I5c86ceadd48a62301158703c026a04d94abb4aff
diff --git a/quic/core/quic_error_codes.cc b/quic/core/quic_error_codes.cc index 9916463..e8324b5 100644 --- a/quic/core/quic_error_codes.cc +++ b/quic/core/quic_error_codes.cc
@@ -3,6 +3,7 @@ // found in the LICENSE file. #include "net/third_party/quiche/src/quic/core/quic_error_codes.h" +#include <cstdint> #include "third_party/boringssl/src/include/openssl/ssl.h" #include "net/third_party/quiche/src/quic/platform/api/quic_logging.h" #include "net/third_party/quiche/src/common/platform/api/quiche_str_cat.h" @@ -199,6 +200,7 @@ RETURN_STRING_LITERAL(QUIC_HTTP_MISSING_SETTINGS_FRAME); RETURN_STRING_LITERAL(QUIC_HTTP_DUPLICATE_SETTING_IDENTIFIER); RETURN_STRING_LITERAL(QUIC_HTTP_INVALID_MAX_PUSH_ID); + RETURN_STRING_LITERAL(QUIC_HTTP_STREAM_LIMIT_TOO_LOW); RETURN_STRING_LITERAL(QUIC_HPACK_INDEX_VARINT_ERROR); RETURN_STRING_LITERAL(QUIC_HPACK_NAME_LENGTH_VARINT_ERROR); RETURN_STRING_LITERAL(QUIC_HPACK_VALUE_LENGTH_VARINT_ERROR); @@ -560,6 +562,9 @@ return {false, static_cast<uint64_t>(QuicHttp3ErrorCode::SETTINGS_ERROR)}; case QUIC_HTTP_INVALID_MAX_PUSH_ID: return {false, static_cast<uint64_t>(QuicHttp3ErrorCode::ID_ERROR)}; + case QUIC_HTTP_STREAM_LIMIT_TOO_LOW: + return {false, static_cast<uint64_t>( + QuicHttp3ErrorCode::GENERAL_PROTOCOL_ERROR)}; case QUIC_HPACK_INDEX_VARINT_ERROR: return {true, static_cast<uint64_t>(INTERNAL_ERROR)}; case QUIC_HPACK_NAME_LENGTH_VARINT_ERROR:
diff --git a/quic/core/quic_error_codes.h b/quic/core/quic_error_codes.h index efdb5f3..f057fea 100644 --- a/quic/core/quic_error_codes.h +++ b/quic/core/quic_error_codes.h
@@ -429,6 +429,8 @@ // MAX_PUSH_ID frame received with push ID value smaller than a previously // received value. QUIC_HTTP_INVALID_MAX_PUSH_ID = 159, + // Received unidirectional stream limit is lower than required by HTTP/3. + QUIC_HTTP_STREAM_LIMIT_TOO_LOW = 160, // HPACK header block decoding errors. // Index varint beyond implementation limit. @@ -465,7 +467,7 @@ QUIC_HPACK_COMPRESSED_HEADER_SIZE_EXCEEDS_LIMIT = 150, // No error. Used as bound while iterating. - QUIC_LAST_ERROR = 160, + QUIC_LAST_ERROR = 161, }; // QuicErrorCodes is encoded as four octets on-the-wire when doing Google QUIC, // or a varint62 when doing IETF QUIC. Ensure that its value does not exceed
diff --git a/quic/core/quic_session.cc b/quic/core/quic_session.cc index e85644d..4862d50 100644 --- a/quic/core/quic_session.cc +++ b/quic/core/quic_session.cc
@@ -1129,13 +1129,14 @@ max_streams = config_.ReceivedMaxUnidirectionalStreams(); } if (max_streams < num_expected_unidirectional_static_streams_) { - // TODO(ianswett): Change this to an application error for HTTP/3. QUIC_DLOG(ERROR) << "Received unidirectional stream limit of " << max_streams << " < " << num_expected_unidirectional_static_streams_; connection_->CloseConnection( - QUIC_MAX_STREAMS_ERROR, "New unidirectional stream limit is too low.", + QUIC_HTTP_STREAM_LIMIT_TOO_LOW, + "New unidirectional stream limit is too low.", ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET); + return; } QUIC_DVLOG(1) << ENDPOINT << "Setting Unidirectional outgoing_max_streams_ to "