Chromium Code Reviews| Index: net/dns/dns_hosts.cc |
| diff --git a/net/dns/dns_hosts.cc b/net/dns/dns_hosts.cc |
| index 2fb627e81f7b04653ee1b5906a8f5a7a90ab6ee6..d6d37bb88f8fcc470f9cb828da2e644f055007b1 100644 |
| --- a/net/dns/dns_hosts.cc |
| +++ b/net/dns/dns_hosts.cc |
| @@ -19,13 +19,14 @@ namespace net { |
| // returns tokens as StringPieces. |
| class HostsParser { |
| public: |
| - explicit HostsParser(const StringPiece& text) |
| + explicit HostsParser(const StringPiece& text, ParseHostsCommaMode comma_mode) |
| : text_(text), |
| data_(text.data()), |
| end_(text.size()), |
| pos_(0), |
| token_(), |
|
mmenke
2014/07/24 21:32:30
While you're here, don't need to use parens for no
Deprecated (see juliatuttle)
2014/07/25 19:34:43
Done.
|
| - token_is_ip_(false) {} |
| + token_is_ip_(false), |
| + comma_mode_(comma_mode) {} |
| // Advances to the next token (IP or hostname). Returns whether another |
| // token was available. |token_is_ip| and |token| can be used to find out |
| @@ -49,6 +50,14 @@ class HostsParser { |
| SkipRestOfLine(); |
| break; |
| + case ',': |
| + if (comma_mode_ == PARSE_HOSTS_COMMA_IS_WHITESPACE) { |
| + SkipWhitespace(); |
| + break; |
| + } |
| + |
| + // if comma_mode_ is _COMMA_IS_TOKEN, fall through: |
|
mmenke
2014/07/24 21:32:30
nit: Capitalize if, and I think just COMMA_IS_TOK
Deprecated (see juliatuttle)
2014/07/25 19:34:43
Done.
|
| + |
| default: { |
| size_t token_start = pos_; |
| SkipToken(); |
| @@ -62,7 +71,6 @@ class HostsParser { |
| } |
| } |
| - text_ = StringPiece(); |
| return false; |
| } |
| @@ -85,14 +93,28 @@ class HostsParser { |
| private: |
| void SkipToken() { |
| - pos_ = text_.find_first_of(" \t\n\r#", pos_); |
| + switch (comma_mode_) { |
| + case PARSE_HOSTS_COMMA_IS_TOKEN: |
| + pos_ = text_.find_first_of(" \t\n\r#", pos_); |
| + break; |
| + case PARSE_HOSTS_COMMA_IS_WHITESPACE: |
| + pos_ = text_.find_first_of(" ,\t\n\r#", pos_); |
| + break; |
| + } |
| } |
| void SkipWhitespace() { |
| - pos_ = text_.find_first_not_of(" \t", pos_); |
| + switch (comma_mode_) { |
| + case PARSE_HOSTS_COMMA_IS_TOKEN: |
| + pos_ = text_.find_first_not_of(" \t", pos_); |
| + break; |
| + case PARSE_HOSTS_COMMA_IS_WHITESPACE: |
| + pos_ = text_.find_first_not_of(" ,\t", pos_); |
| + break; |
| + } |
| } |
| - StringPiece text_; |
| + const StringPiece text_; |
| const char* data_; |
| const size_t end_; |
| @@ -100,19 +122,23 @@ class HostsParser { |
| StringPiece token_; |
| bool token_is_ip_; |
| + const ParseHostsCommaMode comma_mode_; |
| + |
| DISALLOW_COPY_AND_ASSIGN(HostsParser); |
| }; |
| -void ParseHosts(const std::string& contents, DnsHosts* dns_hosts) { |
| +void ParseHostsWithCommaMode(const std::string& contents, |
| + DnsHosts* dns_hosts, |
| + ParseHostsCommaMode comma_mode) { |
| CHECK(dns_hosts); |
| DnsHosts& hosts = *dns_hosts; |
| StringPiece ip_text; |
| IPAddressNumber ip; |
| AddressFamily family = ADDRESS_FAMILY_IPV4; |
| - HostsParser parser(contents); |
| + HostsParser parser(contents, comma_mode); |
| while (parser.Advance()) { |
| if (parser.token_is_ip()) { |
| StringPiece new_ip_text = parser.token(); |
| @@ -140,6 +166,19 @@ void ParseHosts(const std::string& contents, DnsHosts* dns_hosts) { |
| } |
| } |
| +void ParseHosts(const std::string& contents, DnsHosts* dns_hosts) { |
| + ParseHostsCommaMode comma_mode; |
| +#if defined(OS_MACOSX) |
| + // Mac OS X allows commas to separate hostnames. |
| + comma_mode = PARSE_HOSTS_COMMA_IS_WHITESPACE; |
| +#else |
| + // Linux allows commas in hostnames. |
| + comma_mode = PARSE_HOSTS_COMMA_IS_TOKEN; |
| +#endif |
| + |
| + ParseHostsWithCommaMode(contents, dns_hosts, comma_mode); |
| +} |
| + |
| bool ParseHostsFile(const base::FilePath& path, DnsHosts* dns_hosts) { |
| dns_hosts->clear(); |
| // Missing file indicates empty HOSTS. |