Allow overriding method in MasqueOhttpClient

PiperOrigin-RevId: 895975765
diff --git a/quiche/quic/masque/masque_ohttp_client.cc b/quiche/quic/masque/masque_ohttp_client.cc
index f1cbaf7..48bc60f 100644
--- a/quiche/quic/masque/masque_ohttp_client.cc
+++ b/quiche/quic/masque/masque_ohttp_client.cc
@@ -83,6 +83,16 @@
 
 }  // namespace
 
+std::string MasqueOhttpClient::Config::PerRequestConfig::method() const {
+  if (method_.has_value()) {
+    return *method_;
+  }
+  if (!post_data_.empty()) {
+    return "POST";
+  }
+  return "GET";
+}
+
 absl::Status MasqueOhttpClient::Config::PerRequestConfig::AddHeaders(
     const std::vector<std::string>& headers) {
   return ParseHeadersIntoMap(headers, headers_);
@@ -373,7 +383,7 @@
   }
   BinaryHttpRequest::ControlData control_data;
   std::string post_data = per_request_config.post_data();
-  control_data.method = post_data.empty() ? "GET" : "POST";
+  control_data.method = per_request_config.method();
   control_data.scheme = url.scheme();
   control_data.authority = url.HostPort();
   control_data.path = url.PathParamsQuery();
diff --git a/quiche/quic/masque/masque_ohttp_client.h b/quiche/quic/masque/masque_ohttp_client.h
index b5ae175..6286ef0 100644
--- a/quiche/quic/masque/masque_ohttp_client.h
+++ b/quiche/quic/masque/masque_ohttp_client.h
@@ -46,6 +46,7 @@
       PerRequestConfig& operator=(PerRequestConfig&& other) = default;
 
       void SetPostData(const std::string& post_data) { post_data_ = post_data; }
+      void SetMethod(const std::string& method) { method_ = method; }
       absl::Status AddHeaders(const std::vector<std::string>& headers);
       absl::Status AddOuterHeaders(
           const std::vector<std::string>& outer_headers);
@@ -74,6 +75,7 @@
 
       std::string url() const { return url_; }
       std::string post_data() const { return post_data_; }
+      std::string method() const;
       const std::vector<std::pair<std::string, std::string>>& headers() const {
         return headers_;
       }
@@ -101,6 +103,7 @@
      private:
       std::string url_;
       std::string post_data_;
+      std::optional<std::string> method_;
       std::vector<std::pair<std::string, std::string>> headers_;
       std::vector<std::pair<std::string, std::string>> outer_headers_;
       bool use_chunked_ohttp_ = false;
diff --git a/quiche/quic/masque/masque_ohttp_client_bin.cc b/quiche/quic/masque/masque_ohttp_client_bin.cc
index 1b03938..13b9bbb 100644
--- a/quiche/quic/masque/masque_ohttp_client_bin.cc
+++ b/quiche/quic/masque/masque_ohttp_client_bin.cc
@@ -59,6 +59,11 @@
     "file.");
 
 DEFINE_QUICHE_COMMAND_LINE_FLAG(
+    std::optional<std::string>, method, std::nullopt,
+    "Sets the method of the encapsulated request. Defaults to GET, or POST if "
+    "--post_data or --post_data_file is set.");
+
+DEFINE_QUICHE_COMMAND_LINE_FLAG(
     std::vector<std::string>, header, {},
     "Adds a header field to the encapsulated binary request. Separate the "
     "header name and value with a colon. Can be specified multiple times.");
@@ -149,6 +154,8 @@
     }
     post_data = *post_data_from_file;
   }
+  std::optional<std::string> method =
+      quiche::GetQuicheCommandLineFlag(FLAGS_method);
   std::vector<std::string> headers =
       quiche::GetQuicheCommandLineFlag(FLAGS_header);
   std::vector<std::string> key_fetch_headers =
@@ -201,6 +208,9 @@
   for (size_t i = 2; i < urls.size(); ++i) {
     MasqueOhttpClient::Config::PerRequestConfig per_request_config(urls[i]);
     per_request_config.SetPostData(post_data);
+    if (method.has_value()) {
+      per_request_config.SetMethod(*method);
+    }
     QUICHE_RETURN_IF_ERROR(per_request_config.AddHeaders(headers));
     QUICHE_RETURN_IF_ERROR(per_request_config.AddOuterHeaders(outer_headers));
     if (!private_token.empty()) {