Simplify DoH probe and separate it from the UI

This change reduces code duplication by reusing DnsProbeRunner for
probing DoH servers in the UI.  It also extracts the probe logic
from the UI code, in order to reuse it in the forthcoming Android
DoH settings UI.

Change-Id: If6f6f1a8d7b6bb8f1d5810880d56dafbfdcf26f1
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2150031
Auto-Submit: Ben Schwartz <[email protected]>
Reviewed-by: Eric Orth <[email protected]>
Reviewed-by: Esmael Elmoslimany <[email protected]>
Commit-Queue: Eric Orth <[email protected]>
Cr-Commit-Position: refs/heads/master@{#764137}
diff --git a/chrome/browser/net/dns_util.cc b/chrome/browser/net/dns_util.cc
index d03c1e0..f6d97cd3 100644
--- a/chrome/browser/net/dns_util.cc
+++ b/chrome/browser/net/dns_util.cc
@@ -80,4 +80,14 @@
   });
 }
 
+void ApplyDohTemplate(net::DnsConfigOverrides* overrides,
+                      base::StringPiece server_template) {
+  std::string server_method;
+  // We only allow use of templates that have already passed a format
+  // validation check.
+  CHECK(net::dns_util::IsValidDohTemplate(server_template, &server_method));
+  overrides->dns_over_https_servers.emplace({net::DnsOverHttpsServerConfig(
+      std::string(server_template), server_method == "POST")});
+}
+
 }  // namespace chrome_browser_net
diff --git a/chrome/browser/net/dns_util.h b/chrome/browser/net/dns_util.h
index 89b155d73..c1c02e7a 100644
--- a/chrome/browser/net/dns_util.h
+++ b/chrome/browser/net/dns_util.h
@@ -8,6 +8,7 @@
 #include <vector>
 
 #include "base/strings/string_piece.h"
+#include "net/dns/dns_config_overrides.h"
 
 class PrefRegistrySimple;
 class PrefService;
@@ -22,6 +23,10 @@
 // stored preferences.
 bool IsValidDohTemplateGroup(base::StringPiece group);
 
+// Modifies |overrides| to use the DoH server specified by |server_template|.
+void ApplyDohTemplate(net::DnsConfigOverrides* overrides,
+                      base::StringPiece server_template);
+
 const char kDnsOverHttpsModeOff[] = "off";
 const char kDnsOverHttpsModeAutomatic[] = "automatic";
 const char kDnsOverHttpsModeSecure[] = "secure";
diff --git a/chrome/browser/net/dns_util_unittest.cc b/chrome/browser/net/dns_util_unittest.cc
index 578ca7a..0ad4140b 100644
--- a/chrome/browser/net/dns_util_unittest.cc
+++ b/chrome/browser/net/dns_util_unittest.cc
@@ -165,4 +165,24 @@
   EXPECT_FALSE(IsValidDohTemplateGroup("invalid invalid2"));
 }
 
+TEST(DNSUtil, ApplyDohTemplatePost) {
+  std::string post_template("https://valid");
+  net::DnsConfigOverrides overrides;
+  ApplyDohTemplate(&overrides, post_template);
+
+  EXPECT_THAT(overrides.dns_over_https_servers,
+              testing::Optional(ElementsAre(net::DnsOverHttpsServerConfig(
+                  {post_template, true /* use_post */}))));
+}
+
+TEST(DNSUtil, ApplyDohTemplateGet) {
+  std::string get_template("https://valid/{?dns}");
+  net::DnsConfigOverrides overrides;
+  ApplyDohTemplate(&overrides, get_template);
+
+  EXPECT_THAT(overrides.dns_over_https_servers,
+              testing::Optional(ElementsAre(net::DnsOverHttpsServerConfig(
+                  {get_template, false /* use_post */}))));
+}
+
 }  // namespace chrome_browser_net