Add HTTP/3 error codes, use them in HttpDecoder and for unexpected frames in QuicSpdyStream and QuicReceiveControlStream.

ENUM_VALUE_OK=Only changing value of sentinel entry QUIC_LAST_ERROR.

gfe-relnote: n/a, change to QUIC v99-only code.  Protected by existing disabled gfe2_reloadable_flag_quic_enable_version_99.
PiperOrigin-RevId: 290374408
Change-Id: I90837f021f0dd585f8015d2fcae37d0d0eacfed6
diff --git a/quic/core/http/http_decoder.cc b/quic/core/http/http_decoder.cc
index f8a73f4..c5aa08c 100644
--- a/quic/core/http/http_decoder.cc
+++ b/quic/core/http/http_decoder.cc
@@ -128,8 +128,7 @@
   }
 
   if (current_frame_length_ > MaxFrameLength(current_frame_type_)) {
-    // TODO(b/124216424): Use HTTP_EXCESSIVE_LOAD.
-    RaiseError(QUIC_INVALID_FRAME_DATA, "Frame is too large");
+    RaiseError(QUIC_HTTP_FRAME_TOO_LARGE, "Frame is too large.");
     return false;
   }
 
@@ -155,7 +154,8 @@
       // This edge case needs to be handled here, because ReadFramePayload()
       // does not get called if |current_frame_length_| is zero.
       if (current_frame_length_ == 0) {
-        RaiseError(QUIC_INVALID_FRAME_DATA, "Corrupt PUSH_PROMISE frame.");
+        RaiseError(QUIC_HTTP_FRAME_ERROR,
+                   "PUSH_PROMISE frame with empty payload.");
         return false;
       }
       continue_processing = visitor_->OnPushPromiseFrameStart(header_length);
@@ -225,7 +225,8 @@
         DCHECK_EQ(0u, current_push_id_length_);
         current_push_id_length_ = reader->PeekVarInt62Length();
         if (current_push_id_length_ > remaining_frame_length_) {
-          RaiseError(QUIC_INVALID_FRAME_DATA, "PUSH_PROMISE frame malformed.");
+          RaiseError(QUIC_HTTP_FRAME_ERROR,
+                     "Unable to read PUSH_PROMISE push_id.");
           return false;
         }
         if (current_push_id_length_ > reader->BytesRemaining()) {
@@ -336,12 +337,12 @@
       CancelPushFrame frame;
       QuicDataReader reader(buffer_.data(), current_frame_length_);
       if (!reader.ReadVarInt62(&frame.push_id)) {
-        // TODO(b/124216424): Use HTTP_MALFORMED_FRAME.
-        RaiseError(QUIC_INVALID_FRAME_DATA, "Unable to read push_id");
+        RaiseError(QUIC_HTTP_FRAME_ERROR,
+                   "Unable to read CANCEL_PUSH push_id.");
         return false;
       }
       if (!reader.IsDoneReading()) {
-        RaiseError(QUIC_INVALID_FRAME_DATA,
+        RaiseError(QUIC_HTTP_FRAME_ERROR,
                    "Superfluous data in CANCEL_PUSH frame.");
         return false;
       }
@@ -370,13 +371,11 @@
                     "QuicStreamId from uint32_t to uint64_t.");
       uint64_t stream_id;
       if (!reader.ReadVarInt62(&stream_id)) {
-        // TODO(b/124216424): Use HTTP_MALFORMED_FRAME.
-        RaiseError(QUIC_INVALID_FRAME_DATA, "Unable to read GOAWAY stream_id");
+        RaiseError(QUIC_HTTP_FRAME_ERROR, "Unable to read GOAWAY stream_id.");
         return false;
       }
       if (!reader.IsDoneReading()) {
-        RaiseError(QUIC_INVALID_FRAME_DATA,
-                   "Superfluous data in GOAWAY frame.");
+        RaiseError(QUIC_HTTP_FRAME_ERROR, "Superfluous data in GOAWAY frame.");
         return false;
       }
       frame.stream_id = static_cast<QuicStreamId>(stream_id);
@@ -387,12 +386,12 @@
       QuicDataReader reader(buffer_.data(), current_frame_length_);
       MaxPushIdFrame frame;
       if (!reader.ReadVarInt62(&frame.push_id)) {
-        // TODO(b/124216424): Use HTTP_MALFORMED_FRAME.
-        RaiseError(QUIC_INVALID_FRAME_DATA, "Unable to read push_id");
+        RaiseError(QUIC_HTTP_FRAME_ERROR,
+                   "Unable to read MAX_PUSH_ID push_id.");
         return false;
       }
       if (!reader.IsDoneReading()) {
-        RaiseError(QUIC_INVALID_FRAME_DATA,
+        RaiseError(QUIC_HTTP_FRAME_ERROR,
                    "Superfluous data in MAX_PUSH_ID frame.");
         return false;
       }
@@ -403,12 +402,12 @@
       QuicDataReader reader(buffer_.data(), current_frame_length_);
       DuplicatePushFrame frame;
       if (!reader.ReadVarInt62(&frame.push_id)) {
-        // TODO(b/124216424): Use HTTP_MALFORMED_FRAME.
-        RaiseError(QUIC_INVALID_FRAME_DATA, "Unable to read push_id");
+        RaiseError(QUIC_HTTP_FRAME_ERROR,
+                   "Unable to read DUPLICATE_PUSH push_id.");
         return false;
       }
       if (!reader.IsDoneReading()) {
-        RaiseError(QUIC_INVALID_FRAME_DATA,
+        RaiseError(QUIC_HTTP_FRAME_ERROR,
                    "Superfluous data in DUPLICATE_PUSH frame.");
         return false;
       }
@@ -513,22 +512,17 @@
   while (!reader->IsDoneReading()) {
     uint64_t id;
     if (!reader->ReadVarInt62(&id)) {
-      // TODO(b/124216424): Use HTTP_MALFORMED_FRAME.
-      RaiseError(QUIC_INVALID_FRAME_DATA,
-                 "Unable to read settings frame identifier");
+      RaiseError(QUIC_HTTP_FRAME_ERROR, "Unable to read setting identifier.");
       return false;
     }
     uint64_t content;
     if (!reader->ReadVarInt62(&content)) {
-      // TODO(b/124216424): Use HTTP_MALFORMED_FRAME.
-      RaiseError(QUIC_INVALID_FRAME_DATA,
-                 "Unable to read settings frame content");
+      RaiseError(QUIC_HTTP_FRAME_ERROR, "Unable to read setting value.");
       return false;
     }
     auto result = frame->values.insert({id, content});
     if (!result.second) {
-      // TODO(b/124216424): Use HTTP_SETTINGS_ERROR.
-      RaiseError(QUIC_INVALID_FRAME_DATA, "Duplicate SETTINGS identifier.");
+      RaiseError(QUIC_HTTP_FRAME_ERROR, "Duplicate setting identifier.");
       return false;
     }
   }
@@ -539,16 +533,14 @@
                                            PriorityUpdateFrame* frame) {
   uint8_t prioritized_element_type;
   if (!reader->ReadUInt8(&prioritized_element_type)) {
-    // TODO(b/124216424): Use HTTP_MALFORMED_FRAME.
-    RaiseError(QUIC_INVALID_FRAME_DATA,
+    RaiseError(QUIC_HTTP_FRAME_ERROR,
                "Unable to read prioritized element type.");
     return false;
   }
 
   if (prioritized_element_type != REQUEST_STREAM &&
       prioritized_element_type != PUSH_STREAM) {
-    // TODO(b/124216424): Use HTTP_MALFORMED_FRAME.
-    RaiseError(QUIC_INVALID_FRAME_DATA, "Invalid prioritized element type.");
+    RaiseError(QUIC_HTTP_FRAME_ERROR, "Invalid prioritized element type.");
     return false;
   }
 
@@ -556,9 +548,7 @@
       static_cast<PrioritizedElementType>(prioritized_element_type);
 
   if (!reader->ReadVarInt62(&frame->prioritized_element_id)) {
-    // TODO(b/124216424): Use HTTP_MALFORMED_FRAME.
-    RaiseError(QUIC_INVALID_FRAME_DATA,
-               "Unable to read prioritized element id.");
+    RaiseError(QUIC_HTTP_FRAME_ERROR, "Unable to read prioritized element id.");
     return false;
   }