Index: net/proxy/proxy_bypass_rules.cc |
diff --git a/net/proxy/proxy_bypass_rules.cc b/net/proxy/proxy_bypass_rules.cc |
index 6bf1c6157e560e3fa72b1df152affcb037f962a7..239a2fe30c5f0c482f34a546aadeebcb397a11d8 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 @@ class BypassIPBlockRule : public ProxyBypassRules::Rule { |
}; |
// 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 @@ bool ProxyBypassRules::AddRuleFromStringInternal( |
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); |
} |
} |