Change ParseHostAndPort() to not include brackets around IPv6 literals.

There were several consumers assuming that the returned hosts had no brackets.

BUG=417417

Review URL: https://codereview.chromium.org/602973002

Cr-Commit-Position: refs/heads/master@{#296569}
diff --git a/net/proxy/proxy_bypass_rules.cc b/net/proxy/proxy_bypass_rules.cc
index 6bf1c61..239a2fe 100644
--- a/net/proxy/proxy_bypass_rules.cc
+++ b/net/proxy/proxy_bypass_rules.cc
@@ -6,10 +6,11 @@
 
 #include "base/stl_util.h"
 #include "base/strings/string_number_conversions.h"
-#include "base/strings/string_util.h"
-#include "base/strings/stringprintf.h"
 #include "base/strings/string_piece.h"
 #include "base/strings/string_tokenizer.h"
+#include "base/strings/string_util.h"
+#include "base/strings/stringprintf.h"
+#include "net/base/host_port_pair.h"
 #include "net/base/net_util.h"
 
 namespace net {
@@ -131,6 +132,7 @@
 };
 
 // Returns true if the given string represents an IP address.
+// IPv6 addresses are expected to be bracketed.
 bool IsIPAddress(const std::string& domain) {
   // From GURL::HostIsIPAddress()
   url::RawCanonOutputT<char, 128> ignored_output;
@@ -305,9 +307,12 @@
   std::string host;
   int port;
   if (ParseHostAndPort(raw, &host, &port)) {
-    if (IsIPAddress(host)) {
+    // Note that HostPortPair is used to merely to convert any IPv6 literals to
+    // a URL-safe format that can be used by canonicalization below.
+    std::string bracketed_host = HostPortPair(host, 80).HostForURL();
+    if (IsIPAddress(bracketed_host)) {
       // Canonicalize the IP literal before adding it as a string pattern.
-      GURL tmp_url("http://" + host);
+      GURL tmp_url("http://" + bracketed_host);
       return AddRuleForHostname(scheme, tmp_url.host(), port);
     }
   }