Let QuicTestBackend respond with headers.

This is required to test WebRequest API [1] implementation in Chrome.
This CL enables the server to accept "/echoFoo?set-header=bar:baz" query and
responds with "bar:baz" header.

[1] https://developer.chrome.com/docs/extensions/reference/webRequest/#event-onHeadersReceived

PiperOrigin-RevId: 399317110
diff --git a/quic/core/http/end_to_end_test.cc b/quic/core/http/end_to_end_test.cc
index f8446f3..a64114c 100644
--- a/quic/core/http/end_to_end_test.cc
+++ b/quic/core/http/end_to_end_test.cc
@@ -6049,9 +6049,9 @@
     return;
   }
 
-  // "/echoFoo" should be accepted as "echo"
-  WebTransportHttp3* web_transport =
-      CreateWebTransportSession("/echoFoo", /*wait_for_server_response=*/true);
+  // "/echoFoo" should be accepted as "echo" with "set-header" query.
+  WebTransportHttp3* web_transport = CreateWebTransportSession(
+      "/echoFoo?set-header=bar:baz", /*wait_for_server_response=*/true);
   ASSERT_NE(web_transport, nullptr);
 
   server_thread_->Pause();
@@ -6059,6 +6059,10 @@
   EXPECT_TRUE(server_session->GetWebTransportSession(web_transport->id()) !=
               nullptr);
   server_thread_->Resume();
+  const spdy::SpdyHeaderBlock* response_headers = client_->response_headers();
+  auto it = response_headers->find("bar");
+  EXPECT_NE(it, response_headers->end());
+  EXPECT_EQ(it->second, "baz");
 }
 
 TEST_P(EndToEndTest, WebTransportSessionWithLoss) {
diff --git a/quic/test_tools/quic_test_backend.cc b/quic/test_tools/quic_test_backend.cc
index eed6a1a..288a42e 100644
--- a/quic/test_tools/quic_test_backend.cc
+++ b/quic/test_tools/quic_test_backend.cc
@@ -7,6 +7,8 @@
 #include <cstring>
 #include <memory>
 
+#include "absl/strings/str_cat.h"
+#include "absl/strings/str_split.h"
 #include "absl/strings/string_view.h"
 #include "quic/core/quic_buffer_allocator.h"
 #include "quic/core/quic_simple_buffer_allocator.h"
@@ -37,6 +39,21 @@
   if (absl::StartsWith(path, "/echo")) {
     WebTransportResponse response;
     response.response_headers[":status"] = "200";
+    // Add response headers if the paramer has "set-header=XXX:YYY" query.
+    GURL url = GURL(absl::StrCat("https://localhost", path));
+    const std::vector<std::string>& params = absl::StrSplit(url.query(), '&');
+    for (const auto& param : params) {
+      absl::string_view param_view = param;
+      if (absl::ConsumePrefix(&param_view, "set-header=")) {
+        const std::vector<std::string_view> header_value =
+            absl::StrSplit(param_view, ':');
+        if (header_value.size() == 2 &&
+            !absl::StartsWith(header_value[0], ":")) {
+          response.response_headers[header_value[0]] = header_value[1];
+        }
+      }
+    }
+
     response.visitor =
         std::make_unique<EchoWebTransportSessionVisitor>(session);
     return response;