Allow key fetch and key proxy requests without the Accept header in masque_tcp_server

PiperOrigin-RevId: 847230296
diff --git a/quiche/quic/masque/masque_tcp_server_bin.cc b/quiche/quic/masque/masque_tcp_server_bin.cc
index 9abc234..ca3fd56 100644
--- a/quiche/quic/masque/masque_tcp_server_bin.cc
+++ b/quiche/quic/masque/masque_tcp_server_bin.cc
@@ -52,6 +52,7 @@
 #include "quiche/common/quiche_ip_address_family.h"
 #include "quiche/common/quiche_socket_address.h"
 #include "quiche/common/quiche_status_utils.h"
+#include "quiche/common/quiche_text_utils.h"
 #include "quiche/oblivious_http/common/oblivious_http_header_key_config.h"
 #include "quiche/oblivious_http/oblivious_http_gateway.h"
 
@@ -119,6 +120,23 @@
 
 namespace {
 
+bool ListHeaderContainsValue(absl::string_view header,
+                             absl::string_view value) {
+  std::vector<absl::string_view> header_split = absl::StrSplit(header, ',');
+  for (absl::string_view header_value : header_split) {
+    quiche::QuicheTextUtils::RemoveLeadingAndTrailingWhitespace(&header_value);
+    std::vector<absl::string_view> header_value_split =
+        absl::StrSplit(header_value, absl::MaxSplits(';', 1));
+    absl::string_view header_value_without_params = header_value_split[0];
+    quiche::QuicheTextUtils::RemoveLeadingAndTrailingWhitespace(
+        &header_value_without_params);
+    if (header_value_without_params == value) {
+      return true;
+    }
+  }
+  return false;
+}
+
 class MasqueOhttpGateway {
  public:
   class Visitor {
@@ -596,15 +614,18 @@
     auto accept_pair = headers.find("accept");
     if (!gateway_path_.empty() && path == gateway_path_ &&
         masque_ohttp_gateway_ && method_pair->second == "GET" &&
-        accept_pair != headers.end() &&
-        accept_pair->second == "application/ohttp-keys") {
+        (accept_pair == headers.end() ||
+         ListHeaderContainsValue(accept_pair->second,
+                                 "application/ohttp-keys"))) {
       response_headers[":status"] = "200";
       response_headers["content-type"] = "application/ohttp-keys";
       response_body = masque_ohttp_gateway_->concatenated_keys();
     } else if (auto key_proxy_pair = key_proxy_urls_.find(path);
                key_proxy_pair != key_proxy_urls_.end() &&
-               method_pair->second == "GET" && accept_pair != headers.end() &&
-               accept_pair->second == "application/ohttp-keys" &&
+               method_pair->second == "GET" &&
+               (accept_pair == headers.end() ||
+                ListHeaderContainsValue(accept_pair->second,
+                                        "application/ohttp-keys")) &&
                body.empty()) {
       absl::Status status = HandleOhttpKeyProxyRequest(connection, stream_id,
                                                        key_proxy_pair->second);