| Index: net/dns/dns_hosts.cc
|
| diff --git a/net/dns/dns_hosts.cc b/net/dns/dns_hosts.cc
|
| deleted file mode 100644
|
| index 697ea148e007f111c368b4b53d12d09daab1d780..0000000000000000000000000000000000000000
|
| --- a/net/dns/dns_hosts.cc
|
| +++ /dev/null
|
| @@ -1,214 +0,0 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "net/dns/dns_hosts.h"
|
| -
|
| -#include "base/files/file_util.h"
|
| -#include "base/logging.h"
|
| -#include "base/metrics/histogram.h"
|
| -#include "base/strings/string_util.h"
|
| -
|
| -using base::StringPiece;
|
| -
|
| -namespace net {
|
| -
|
| -namespace {
|
| -
|
| -// Parses the contents of a hosts file. Returns one token (IP or hostname) at
|
| -// a time. Doesn't copy anything; accepts the file as a StringPiece and
|
| -// returns tokens as StringPieces.
|
| -class HostsParser {
|
| - public:
|
| - explicit HostsParser(const StringPiece& text, ParseHostsCommaMode comma_mode)
|
| - : text_(text),
|
| - data_(text.data()),
|
| - end_(text.size()),
|
| - pos_(0),
|
| - 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
|
| - // the type and text of the token.
|
| - bool Advance() {
|
| - bool next_is_ip = (pos_ == 0);
|
| - while (pos_ < end_ && pos_ != std::string::npos) {
|
| - switch (text_[pos_]) {
|
| - case ' ':
|
| - case '\t':
|
| - SkipWhitespace();
|
| - break;
|
| -
|
| - case '\r':
|
| - case '\n':
|
| - next_is_ip = true;
|
| - pos_++;
|
| - break;
|
| -
|
| - case '#':
|
| - SkipRestOfLine();
|
| - break;
|
| -
|
| - case ',':
|
| - if (comma_mode_ == PARSE_HOSTS_COMMA_IS_WHITESPACE) {
|
| - SkipWhitespace();
|
| - break;
|
| - }
|
| -
|
| - // If comma_mode_ is COMMA_IS_TOKEN, fall through:
|
| -
|
| - default: {
|
| - size_t token_start = pos_;
|
| - SkipToken();
|
| - size_t token_end = (pos_ == std::string::npos) ? end_ : pos_;
|
| -
|
| - token_ = StringPiece(data_ + token_start, token_end - token_start);
|
| - token_is_ip_ = next_is_ip;
|
| -
|
| - return true;
|
| - }
|
| - }
|
| - }
|
| -
|
| - return false;
|
| - }
|
| -
|
| - // Fast-forwards the parser to the next line. Should be called if an IP
|
| - // address doesn't parse, to avoid wasting time tokenizing hostnames that
|
| - // will be ignored.
|
| - void SkipRestOfLine() {
|
| - pos_ = text_.find("\n", pos_);
|
| - }
|
| -
|
| - // Returns whether the last-parsed token is an IP address (true) or a
|
| - // hostname (false).
|
| - bool token_is_ip() { return token_is_ip_; }
|
| -
|
| - // Returns the text of the last-parsed token as a StringPiece referencing
|
| - // the same underlying memory as the StringPiece passed to the constructor.
|
| - // Returns an empty StringPiece if no token has been parsed or the end of
|
| - // the input string has been reached.
|
| - const StringPiece& token() { return token_; }
|
| -
|
| - private:
|
| - void SkipToken() {
|
| - 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() {
|
| - 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;
|
| - }
|
| - }
|
| -
|
| - const StringPiece text_;
|
| - const char* data_;
|
| - const size_t end_;
|
| -
|
| - size_t pos_;
|
| - StringPiece token_;
|
| - bool token_is_ip_;
|
| -
|
| - const ParseHostsCommaMode comma_mode_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(HostsParser);
|
| -};
|
| -
|
| -void ParseHostsWithCommaMode(const std::string& contents,
|
| - DnsHosts* dns_hosts,
|
| - ParseHostsCommaMode comma_mode) {
|
| - CHECK(dns_hosts);
|
| -
|
| - StringPiece ip_text;
|
| - IPAddressNumber ip;
|
| - AddressFamily family = ADDRESS_FAMILY_IPV4;
|
| - HostsParser parser(contents, comma_mode);
|
| - while (parser.Advance()) {
|
| - if (parser.token_is_ip()) {
|
| - StringPiece new_ip_text = parser.token();
|
| - // Some ad-blocking hosts files contain thousands of entries pointing to
|
| - // the same IP address (usually 127.0.0.1). Don't bother parsing the IP
|
| - // again if it's the same as the one above it.
|
| - if (new_ip_text != ip_text) {
|
| - IPAddressNumber new_ip;
|
| - if (ParseIPLiteralToNumber(parser.token().as_string(), &new_ip)) {
|
| - ip_text = new_ip_text;
|
| - ip.swap(new_ip);
|
| - family = (ip.size() == 4) ? ADDRESS_FAMILY_IPV4 : ADDRESS_FAMILY_IPV6;
|
| - } else {
|
| - parser.SkipRestOfLine();
|
| - }
|
| - }
|
| - } else {
|
| - DnsHostsKey key(parser.token().as_string(), family);
|
| - base::StringToLowerASCII(&key.first);
|
| - IPAddressNumber* mapped_ip = &(*dns_hosts)[key];
|
| - if (mapped_ip->empty())
|
| - *mapped_ip = ip;
|
| - // else ignore this entry (first hit counts)
|
| - }
|
| - }
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -void ParseHostsWithCommaModeForTesting(const std::string& contents,
|
| - DnsHosts* dns_hosts,
|
| - ParseHostsCommaMode comma_mode) {
|
| - ParseHostsWithCommaMode(contents, dns_hosts, comma_mode);
|
| -}
|
| -
|
| -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.
|
| - if (!base::PathExists(path))
|
| - return true;
|
| -
|
| - int64 size;
|
| - if (!base::GetFileSize(path, &size))
|
| - return false;
|
| -
|
| - UMA_HISTOGRAM_COUNTS("AsyncDNS.HostsSize",
|
| - static_cast<base::HistogramBase::Sample>(size));
|
| -
|
| - // Reject HOSTS files larger than |kMaxHostsSize| bytes.
|
| - const int64 kMaxHostsSize = 1 << 25; // 32MB
|
| - if (size > kMaxHostsSize)
|
| - return false;
|
| -
|
| - std::string contents;
|
| - if (!base::ReadFileToString(path, &contents))
|
| - return false;
|
| -
|
| - ParseHosts(contents, dns_hosts);
|
| - return true;
|
| -}
|
| -
|
| -} // namespace net
|
| -
|
|
|