| Index: net/base/ssl_false_start_blacklist_process.cc
 | 
| diff --git a/net/base/ssl_false_start_blacklist_process.cc b/net/base/ssl_false_start_blacklist_process.cc
 | 
| deleted file mode 100644
 | 
| index e1ff7d226ad7ac5d6ec6b94f60d43dfd1644baeb..0000000000000000000000000000000000000000
 | 
| --- a/net/base/ssl_false_start_blacklist_process.cc
 | 
| +++ /dev/null
 | 
| @@ -1,214 +0,0 @@
 | 
| -// Copyright (c) 2011 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.
 | 
| -
 | 
| -// This utility program exists to process the False Start blacklist file into
 | 
| -// a static hash table so that it can be efficiently queried by Chrome.
 | 
| -
 | 
| -#include <algorithm>
 | 
| -#include <cstdio>
 | 
| -#include <set>
 | 
| -#include <sstream>
 | 
| -#include <string>
 | 
| -#include <vector>
 | 
| -
 | 
| -#include "base/basictypes.h"
 | 
| -#include "base/file_util.h"
 | 
| -#include "base/string_util.h"
 | 
| -#include "net/base/ssl_false_start_blacklist.h"
 | 
| -
 | 
| -typedef std::vector<std::string> Hosts;
 | 
| -
 | 
| -// Parses |input| as a blacklist data file, and returns the set of hosts it
 | 
| -// contains.
 | 
| -Hosts ParseHosts(const std::string& input) {
 | 
| -  Hosts hosts;
 | 
| -  size_t line_start = 0;
 | 
| -  bool is_comment = false;
 | 
| -  bool non_whitespace_seen = false;
 | 
| -  for (size_t i = 0; i <= input.size(); ++i) {
 | 
| -    if (i == input.size() || input[i] == '\n') {
 | 
| -      if (!is_comment && non_whitespace_seen) {
 | 
| -        size_t len = i - line_start;
 | 
| -        if (i > 0 && input[i - 1] == '\r')
 | 
| -          len--;
 | 
| -        hosts.push_back(input.substr(line_start, len));
 | 
| -      }
 | 
| -      is_comment = false;
 | 
| -      non_whitespace_seen = false;
 | 
| -      line_start = i + 1;
 | 
| -    } else if (input[i] != ' ' && input[i] != '\t' && input[i] != '\r') {
 | 
| -      non_whitespace_seen = true;
 | 
| -      if (i == line_start && input[i] == '#')
 | 
| -        is_comment = true;
 | 
| -    }
 | 
| -  }
 | 
| -  VLOG(1) << "Have " << hosts.size() << " hosts after parse";
 | 
| -  return hosts;
 | 
| -}
 | 
| -
 | 
| -// Returns |host| with any initial "www." and trailing dots removed.  Partly
 | 
| -// based on net::StripWWW().
 | 
| -std::string StripWWWAndTrailingDots(const std::string& host) {
 | 
| -  const std::string www("www.");
 | 
| -  const size_t start = StartsWithASCII(host, www, true) ? www.length() : 0;
 | 
| -  const size_t end = host.find_last_not_of('.');
 | 
| -  return (end == std::string::npos) ?
 | 
| -      std::string() : host.substr(start, end - start + 1);
 | 
| -}
 | 
| -
 | 
| -// Removes all duplicates from |hosts|.
 | 
| -static void RemoveDuplicateEntries(std::vector<std::string>* hosts) {
 | 
| -  std::sort(hosts->begin(), hosts->end());
 | 
| -  hosts->erase(std::unique(hosts->begin(), hosts->end()), hosts->end());
 | 
| -  VLOG(1) << "Have " << hosts->size() << " hosts after removing duplicates";
 | 
| -}
 | 
| -
 | 
| -// Returns the parent domain for |host|, or the empty string if the name is a
 | 
| -// top-level domain.
 | 
| -static std::string ParentDomain(const std::string& host) {
 | 
| -  const size_t first_dot = host.find('.');
 | 
| -  return (first_dot == std::string::npos) ?
 | 
| -      std::string() : host.substr(first_dot + 1);
 | 
| -}
 | 
| -
 | 
| -// Predicate which returns true when a hostname has a parent domain in the set
 | 
| -// of hosts provided at construction time.
 | 
| -class ParentInSet : public std::unary_function<std::string, bool> {
 | 
| - public:
 | 
| -  explicit ParentInSet(const std::set<std::string>& hosts) : hosts_(hosts) {}
 | 
| -
 | 
| -  bool operator()(const std::string& host) const {
 | 
| -    for (std::string parent(ParentDomain(host)); !parent.empty();
 | 
| -         parent = ParentDomain(parent)) {
 | 
| -      if (hosts_.count(parent)) {
 | 
| -        VLOG(1) << "Removing " << host << " as redundant";
 | 
| -        return true;
 | 
| -      }
 | 
| -    }
 | 
| -    return false;
 | 
| -  }
 | 
| -
 | 
| - private:
 | 
| -  const std::set<std::string>& hosts_;
 | 
| -};
 | 
| -
 | 
| -// Removes any hosts which are subdomains of other hosts.  E.g.
 | 
| -// "foo.example.com" would be removed if "example.com" were also included.
 | 
| -static void RemoveRedundantEntries(Hosts* hosts) {
 | 
| -  std::set<std::string> hosts_set;
 | 
| -  for (Hosts::const_iterator i(hosts->begin()); i != hosts->end(); ++i)
 | 
| -    hosts_set.insert(*i);
 | 
| -  hosts->erase(std::remove_if(hosts->begin(), hosts->end(),
 | 
| -                              ParentInSet(hosts_set)), hosts->end());
 | 
| -  VLOG(1) << "Have " << hosts->size() << " hosts after removing redundants";
 | 
| -}
 | 
| -
 | 
| -// Returns true iff all |hosts| are less than 256 bytes long (not including the
 | 
| -// terminating NUL) and contain two or more dot-separated components.
 | 
| -static bool CheckLengths(const Hosts& hosts) {
 | 
| -  for (Hosts::const_iterator i(hosts.begin()); i != hosts.end(); ++i) {
 | 
| -     if (i->size() >= 256) {
 | 
| -       fprintf(stderr, "Entry '%s' is too large\n", i->c_str());
 | 
| -       return false;
 | 
| -     }
 | 
| -     if (net::SSLFalseStartBlacklist::LastTwoComponents(*i).empty()) {
 | 
| -       fprintf(stderr, "Entry '%s' contains too few labels\n", i->c_str());
 | 
| -       return false;
 | 
| -     }
 | 
| -  }
 | 
| -
 | 
| -  return true;
 | 
| -}
 | 
| -
 | 
| -// Returns the contents of the output file to be written.
 | 
| -std::string GenerateOutput(const Hosts& hosts) {
 | 
| -  // Hash each host into its appropriate bucket.
 | 
| -  VLOG(1) << "Using " << net::SSLFalseStartBlacklist::kBuckets
 | 
| -          << " entry hash table";
 | 
| -  Hosts buckets[net::SSLFalseStartBlacklist::kBuckets];
 | 
| -  for (Hosts::const_iterator i(hosts.begin()); i != hosts.end(); ++i) {
 | 
| -    const uint32 hash = net::SSLFalseStartBlacklist::Hash(
 | 
| -        net::SSLFalseStartBlacklist::LastTwoComponents(*i));
 | 
| -    buckets[hash & (net::SSLFalseStartBlacklist::kBuckets - 1)].push_back(*i);
 | 
| -  }
 | 
| -
 | 
| -  // Write header.
 | 
| -  std::ostringstream output;
 | 
| -  output << "// Copyright (c) 2011 The Chromium Authors. All rights reserved.\n"
 | 
| -            "// Use of this source code is governed by a BSD-style license that"
 | 
| -            " can be\n// found in the LICENSE file.\n\n// WARNING: This code is"
 | 
| -            " generated by ssl_false_start_blacklist_process.cc.\n// Do not "
 | 
| -            "edit.\n\n#include \"net/base/ssl_false_start_blacklist.h\"\n\n"
 | 
| -            "namespace net {\n\nconst uint32 "
 | 
| -            "SSLFalseStartBlacklist::kHashTable["
 | 
| -         << net::SSLFalseStartBlacklist::kBuckets << " + 1] = {\n  0,\n";
 | 
| -
 | 
| -  // Construct data table, writing out the size as each bucket is appended.
 | 
| -  std::string table_data;
 | 
| -  size_t max_bucket_size = 0;
 | 
| -  for (size_t i = 0; i < net::SSLFalseStartBlacklist::kBuckets; i++) {
 | 
| -    max_bucket_size = std::max(max_bucket_size, buckets[i].size());
 | 
| -    for (Hosts::const_iterator j(buckets[i].begin()); j != buckets[i].end();
 | 
| -         ++j) {
 | 
| -      table_data.push_back(static_cast<char>(j->size()));
 | 
| -      table_data.append(*j);
 | 
| -    }
 | 
| -    output << "  " << table_data.size() << ",\n";
 | 
| -  }
 | 
| -  output << "};\n\n";
 | 
| -  VLOG(1) << "Largest bucket has " << max_bucket_size << " entries";
 | 
| -
 | 
| -  // Write data table, breaking lines after 72+ (2 indent, 70+ data) characters.
 | 
| -  output << "const char SSLFalseStartBlacklist::kHashData[] = {\n";
 | 
| -  for (size_t i = 0, line_length = 0; i < table_data.size(); i++) {
 | 
| -    if (line_length == 0)
 | 
| -      output << "  ";
 | 
| -    std::ostringstream::pos_type current_length = output.tellp();
 | 
| -    output << static_cast<int>(table_data[i]) << ", ";
 | 
| -    line_length += output.tellp() - current_length;
 | 
| -    if (i == table_data.size() - 1) {
 | 
| -      output << "\n};\n";
 | 
| -    } else if (line_length >= 70) {
 | 
| -      output << "\n";
 | 
| -      line_length = 0;
 | 
| -    }
 | 
| -  }
 | 
| -  output << "\n}  // namespace net\n";
 | 
| -  return output.str();
 | 
| -}
 | 
| -
 | 
| -#if defined(OS_WIN)
 | 
| -int wmain(int argc, wchar_t* argv[], wchar_t* envp[]) {
 | 
| -#elif defined(OS_POSIX)
 | 
| -int main(int argc, char* argv[], char* envp[]) {
 | 
| -#endif
 | 
| -  if (argc != 3) {
 | 
| -    fprintf(stderr, "Usage: %s <blacklist file> <output .c file>\n", argv[0]);
 | 
| -    return 1;
 | 
| -  }
 | 
| -
 | 
| -  // Read input file.
 | 
| -  std::string input;
 | 
| -  if (!file_util::ReadFileToString(FilePath(argv[1]), &input)) {
 | 
| -    fprintf(stderr, "Failed to read input file '%s'\n", argv[1]);
 | 
| -    return 2;
 | 
| -  }
 | 
| -  Hosts hosts(ParseHosts(input));
 | 
| -
 | 
| -  // Sanitize |hosts|.
 | 
| -  std::transform(hosts.begin(), hosts.end(), hosts.begin(),
 | 
| -                 StripWWWAndTrailingDots);
 | 
| -  RemoveDuplicateEntries(&hosts);
 | 
| -  RemoveRedundantEntries(&hosts);
 | 
| -  if (!CheckLengths(hosts))
 | 
| -    return 3;
 | 
| -
 | 
| -  // Write output file.
 | 
| -  const std::string output_str(GenerateOutput(hosts));
 | 
| -  if (file_util::WriteFile(FilePath(argv[2]), output_str.data(),
 | 
| -      output_str.size()) == static_cast<int>(output_str.size()))
 | 
| -    return 0;
 | 
| -  fprintf(stderr, "Failed to write output file '%s'\n", argv[2]);
 | 
| -  return 4;
 | 
| -}
 | 
| 
 |