Use QUIC_INVALID_FRAME_DATA in HttpDecoder.

QUIC_INTERNAL_ERROR is not quite appropriate for an error that can be triggered
by network input.  Of course this is all temporary until HTTP/3 error codes are
added.

gfe-relnote: n/a, change to QUIC v99-only code.  Protected by existing disabled gfe2_reloadable_flag_quic_enable_version_99.
PiperOrigin-RevId: 262340004
Change-Id: I104caf8eaed62cc42279e92ea4f63d0baded59bd
diff --git a/quic/core/http/http_decoder.cc b/quic/core/http/http_decoder.cc
index e105fc6..1a89324 100644
--- a/quic/core/http/http_decoder.cc
+++ b/quic/core/http/http_decoder.cc
@@ -124,8 +124,8 @@
   }
 
   if (current_frame_length_ > MaxFrameLength(current_frame_type_)) {
-    // TODO(bnc): Signal HTTP_EXCESSIVE_LOAD or similar to peer.
-    RaiseError(QUIC_INTERNAL_ERROR, "Frame is too large");
+    // TODO(b/124216424): Use HTTP_EXCESSIVE_LOAD.
+    RaiseError(QUIC_INVALID_FRAME_DATA, "Frame is too large");
     return false;
   }
 
@@ -220,7 +220,8 @@
         QuicByteCount push_id_length = reader->PeekVarInt62Length();
         // TODO(rch): Handle partial delivery of this field.
         if (!reader->ReadVarInt62(&push_id)) {
-          RaiseError(QUIC_INTERNAL_ERROR, "Unable to read push_id");
+          // TODO(b/124216424): Use HTTP_MALFORMED_FRAME.
+          RaiseError(QUIC_INVALID_FRAME_DATA, "Unable to read push_id");
           return false;
         }
         remaining_frame_length_ -= bytes_remaining - reader->BytesRemaining();
@@ -309,7 +310,8 @@
       CancelPushFrame frame;
       QuicDataReader reader(buffer_.data(), current_frame_length_);
       if (!reader.ReadVarInt62(&frame.push_id)) {
-        RaiseError(QUIC_INTERNAL_ERROR, "Unable to read push_id");
+        // TODO(b/124216424): Use HTTP_MALFORMED_FRAME.
+        RaiseError(QUIC_INVALID_FRAME_DATA, "Unable to read push_id");
         return false;
       }
       continue_processing = visitor_->OnCancelPushFrame(frame);
@@ -338,7 +340,8 @@
                     "QuicStreamId from uint32_t to uint64_t.");
       uint64_t stream_id;
       if (!reader.ReadVarInt62(&stream_id)) {
-        RaiseError(QUIC_INTERNAL_ERROR, "Unable to read GOAWAY stream_id");
+        // TODO(b/124216424): Use HTTP_MALFORMED_FRAME.
+        RaiseError(QUIC_INVALID_FRAME_DATA, "Unable to read GOAWAY stream_id");
         return false;
       }
       frame.stream_id = static_cast<QuicStreamId>(stream_id);
@@ -350,7 +353,8 @@
       QuicDataReader reader(buffer_.data(), current_frame_length_);
       MaxPushIdFrame frame;
       if (!reader.ReadVarInt62(&frame.push_id)) {
-        RaiseError(QUIC_INTERNAL_ERROR, "Unable to read push_id");
+        // TODO(b/124216424): Use HTTP_MALFORMED_FRAME.
+        RaiseError(QUIC_INVALID_FRAME_DATA, "Unable to read push_id");
         return false;
       }
       continue_processing = visitor_->OnMaxPushIdFrame(frame);
@@ -361,7 +365,8 @@
       QuicDataReader reader(buffer_.data(), current_frame_length_);
       DuplicatePushFrame frame;
       if (!reader.ReadVarInt62(&frame.push_id)) {
-        RaiseError(QUIC_INTERNAL_ERROR, "Unable to read push_id");
+        // TODO(b/124216424): Use HTTP_MALFORMED_FRAME.
+        RaiseError(QUIC_INVALID_FRAME_DATA, "Unable to read push_id");
         return false;
       }
       continue_processing = visitor_->OnDuplicatePushFrame(frame);
@@ -494,13 +499,16 @@
     // TODO(bnc): Handle partial delivery of both fields.
     uint64_t id;
     if (!reader->ReadVarInt62(&id)) {
-      RaiseError(QUIC_INTERNAL_ERROR,
+      // TODO(b/124216424): Use HTTP_MALFORMED_FRAME.
+      RaiseError(QUIC_INVALID_FRAME_DATA,
                  "Unable to read settings frame identifier");
       return false;
     }
     uint64_t content;
     if (!reader->ReadVarInt62(&content)) {
-      RaiseError(QUIC_INTERNAL_ERROR, "Unable to read settings frame content");
+      // TODO(b/124216424): Use HTTP_MALFORMED_FRAME.
+      RaiseError(QUIC_INVALID_FRAME_DATA,
+                 "Unable to read settings frame content");
       return false;
     }
     frame->values[id] = content;
diff --git a/quic/core/http/http_decoder_test.cc b/quic/core/http/http_decoder_test.cc
index 7cbe949..313af62 100644
--- a/quic/core/http/http_decoder_test.cc
+++ b/quic/core/http/http_decoder_test.cc
@@ -491,7 +491,7 @@
     QuicByteCount processed_bytes =
         decoder.ProcessInput(input.data(), input.size());
     EXPECT_EQ(input.size(), processed_bytes);
-    EXPECT_EQ(QUIC_INTERNAL_ERROR, decoder.error());
+    EXPECT_EQ(QUIC_INVALID_FRAME_DATA, decoder.error());
     EXPECT_EQ(test_data.error_message, decoder.error_detail());
   }
 }
@@ -775,7 +775,7 @@
   // Process the full frame.
   EXPECT_CALL(visitor_, OnError(&decoder_));
   EXPECT_EQ(2u, ProcessInput(input));
-  EXPECT_EQ(QUIC_INTERNAL_ERROR, decoder_.error());
+  EXPECT_EQ(QUIC_INVALID_FRAME_DATA, decoder_.error());
   EXPECT_EQ("Frame is too large", decoder_.error_detail());
 }
 
@@ -790,7 +790,7 @@
   writer.WriteStringPiece("Malformed payload");
   EXPECT_CALL(visitor_, OnError(&decoder_));
   EXPECT_EQ(5u, decoder_.ProcessInput(input, QUIC_ARRAYSIZE(input)));
-  EXPECT_EQ(QUIC_INTERNAL_ERROR, decoder_.error());
+  EXPECT_EQ(QUIC_INVALID_FRAME_DATA, decoder_.error());
   EXPECT_EQ("Frame is too large", decoder_.error_detail());
 }
 
@@ -861,7 +861,7 @@
 
       QuicStringPiece input(test_data.input);
       decoder.ProcessInput(input.data(), input.size());
-      EXPECT_EQ(QUIC_INTERNAL_ERROR, decoder.error());
+      EXPECT_EQ(QUIC_INVALID_FRAME_DATA, decoder.error());
       EXPECT_EQ(test_data.error_message, decoder.error_detail());
     }
     {
@@ -872,7 +872,7 @@
       for (auto c : input) {
         decoder.ProcessInput(&c, 1);
       }
-      EXPECT_EQ(QUIC_INTERNAL_ERROR, decoder.error());
+      EXPECT_EQ(QUIC_INVALID_FRAME_DATA, decoder.error());
       EXPECT_EQ(test_data.error_message, decoder.error_detail());
     }
   }