Reset WebTransport CONNECT stream if 404 is received.

We don't have any need to read the response body in those cases, nor is our code base set up to do so (in fact, it will hit GFE_BUGs).

PiperOrigin-RevId: 401109422
diff --git a/quic/core/http/end_to_end_test.cc b/quic/core/http/end_to_end_test.cc
index f5aa312..1e94413 100644
--- a/quic/core/http/end_to_end_test.cc
+++ b/quic/core/http/end_to_end_test.cc
@@ -6503,6 +6503,32 @@
   }));
 }
 
+TEST_P(EndToEndTest, WebTransportSession404) {
+  enable_web_transport_ = true;
+  ASSERT_TRUE(Initialize());
+
+  if (!version_.UsesHttp3()) {
+    return;
+  }
+
+  WebTransportHttp3* session = CreateWebTransportSession(
+      "/does-not-exist", /*wait_for_server_response=*/false);
+  ASSERT_TRUE(session != nullptr);
+  QuicSpdyStream* connect_stream = client_->latest_created_stream();
+  QuicStreamId connect_stream_id = connect_stream->id();
+
+  WebTransportStream* stream = session->OpenOutgoingBidirectionalStream();
+  ASSERT_TRUE(stream != nullptr);
+  EXPECT_TRUE(stream->Write("test"));
+  EXPECT_TRUE(stream->SendFin());
+
+  client_->WaitUntil(-1, [connect_stream]() {
+    return connect_stream->headers_decompressed();
+  });
+  EXPECT_TRUE(GetClientSession()->GetOrCreateSpdyDataStream(
+                  connect_stream_id) == nullptr);
+}
+
 }  // namespace
 }  // namespace test
 }  // namespace quic
diff --git a/quic/core/http/quic_spdy_client_stream.cc b/quic/core/http/quic_spdy_client_stream.cc
index 7f55fef..7391fdc 100644
--- a/quic/core/http/quic_spdy_client_stream.cc
+++ b/quic/core/http/quic_spdy_client_stream.cc
@@ -61,8 +61,13 @@
   if (web_transport() != nullptr) {
     web_transport()->HeadersReceived(response_headers_);
     if (!web_transport()->ready()) {
-      // Rejected due to status not being 200, or other reason.
-      WriteOrBufferData("", /*fin=*/true, nullptr);
+      // The request was rejected by WebTransport, typically due to not having a
+      // 2xx status.  The reason we're using Reset() here rather than closing
+      // cleanly is that even if the server attempts to send us any form of body
+      // with a 4xx request, we've already set up the capsule parser, and we
+      // don't have any way to process anything from the response body in
+      // question.
+      Reset(QUIC_STREAM_CANCELLED);
       return;
     }
   }