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(¶m_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;