OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/tools/tld_cleanup/tld_cleanup_util.h" | 5 #include "net/tools/tld_cleanup/tld_cleanup_util.h" |
6 | 6 |
7 #include "base/file_util.h" | 7 #include "base/file_util.h" |
8 #include "base/logging.h" | 8 #include "base/logging.h" |
9 #include "base/strings/string_number_conversions.h" | 9 #include "base/strings/string_number_conversions.h" |
10 #include "base/strings/string_util.h" | 10 #include "base/strings/string_util.h" |
(...skipping 11 matching lines...) Expand all Loading... |
22 } | 22 } |
23 | 23 |
24 namespace net { | 24 namespace net { |
25 namespace tld_cleanup { | 25 namespace tld_cleanup { |
26 | 26 |
27 // Writes the list of domain rules contained in the 'rules' set to the | 27 // Writes the list of domain rules contained in the 'rules' set to the |
28 // 'outfile', with each rule terminated by a LF. The file must already have | 28 // 'outfile', with each rule terminated by a LF. The file must already have |
29 // been created with write access. | 29 // been created with write access. |
30 bool WriteRules(const RuleMap& rules, const base::FilePath& outfile) { | 30 bool WriteRules(const RuleMap& rules, const base::FilePath& outfile) { |
31 std::string data; | 31 std::string data; |
32 data.append("%{\n" | 32 data.append( |
33 "// Copyright 2012 The Chromium Authors. All rights reserved.\n" | 33 "%{\n" |
34 "// Use of this source code is governed by a BSD-style license " | 34 "// Copyright 2012 The Chromium Authors. All rights reserved.\n" |
35 "that can be\n" | 35 "// Use of this source code is governed by a BSD-style license " |
36 "// found in the LICENSE file.\n\n" | 36 "that can be\n" |
37 "// This file is generated by net/tools/tld_cleanup/.\n" | 37 "// found in the LICENSE file.\n\n" |
38 "// DO NOT MANUALLY EDIT!\n" | 38 "// This file is generated by net/tools/tld_cleanup/.\n" |
39 "%}\n" | 39 "// DO NOT MANUALLY EDIT!\n" |
40 "struct DomainRule {\n" | 40 "%}\n" |
41 " int name_offset;\n" | 41 "struct DomainRule {\n" |
42 " int type; // flags: 1: exception, 2: wildcard, 4: private\n" | 42 " int name_offset;\n" |
43 "};\n" | 43 " int type; // flags: 1: exception, 2: wildcard, 4: private\n" |
44 "%%\n"); | 44 "};\n" |
| 45 "%%\n"); |
45 | 46 |
46 for (RuleMap::const_iterator i = rules.begin(); i != rules.end(); ++i) { | 47 for (RuleMap::const_iterator i = rules.begin(); i != rules.end(); ++i) { |
47 data.append(i->first); | 48 data.append(i->first); |
48 data.append(", "); | 49 data.append(", "); |
49 int type = 0; | 50 int type = 0; |
50 if (i->second.exception) { | 51 if (i->second.exception) { |
51 type = kExceptionRule; | 52 type = kExceptionRule; |
52 } else if (i->second.wildcard) { | 53 } else if (i->second.wildcard) { |
53 type = kWildcardRule; | 54 type = kWildcardRule; |
54 } | 55 } |
55 if (i->second.is_private) { | 56 if (i->second.is_private) { |
56 type += kPrivateRule; | 57 type += kPrivateRule; |
57 } | 58 } |
58 data.append(base::IntToString(type)); | 59 data.append(base::IntToString(type)); |
59 data.append("\n"); | 60 data.append("\n"); |
60 } | 61 } |
61 | 62 |
62 data.append("%%\n"); | 63 data.append("%%\n"); |
63 | 64 |
64 int written = base::WriteFile(outfile, | 65 int written = |
65 data.data(), | 66 base::WriteFile(outfile, data.data(), static_cast<int>(data.size())); |
66 static_cast<int>(data.size())); | |
67 | 67 |
68 return written == static_cast<int>(data.size()); | 68 return written == static_cast<int>(data.size()); |
69 } | 69 } |
70 | 70 |
71 // Adjusts the rule to a standard form: removes single extraneous dots and | 71 // Adjusts the rule to a standard form: removes single extraneous dots and |
72 // canonicalizes it using GURL. Returns kSuccess if the rule is interpreted as | 72 // canonicalizes it using GURL. Returns kSuccess if the rule is interpreted as |
73 // valid; logs a warning and returns kWarning if it is probably invalid; and | 73 // valid; logs a warning and returns kWarning if it is probably invalid; and |
74 // logs an error and returns kError if the rule is (almost) certainly invalid. | 74 // logs an error and returns kError if the rule is (almost) certainly invalid. |
75 NormalizeResult NormalizeRule(std::string* domain, Rule* rule) { | 75 NormalizeResult NormalizeRule(std::string* domain, Rule* rule) { |
76 NormalizeResult result = kSuccess; | 76 NormalizeResult result = kSuccess; |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
122 } | 122 } |
123 if (!gurl.is_valid()) { | 123 if (!gurl.is_valid()) { |
124 LOG(WARNING) << "Keeping rule that GURL says is invalid: " << *domain; | 124 LOG(WARNING) << "Keeping rule that GURL says is invalid: " << *domain; |
125 result = kWarning; | 125 result = kWarning; |
126 } | 126 } |
127 domain->assign(spec.substr(host.begin, host.len)); | 127 domain->assign(spec.substr(host.begin, host.len)); |
128 | 128 |
129 return result; | 129 return result; |
130 } | 130 } |
131 | 131 |
132 NormalizeResult NormalizeDataToRuleMap(const std::string data, | 132 NormalizeResult NormalizeDataToRuleMap(const std::string data, RuleMap* rules) { |
133 RuleMap* rules) { | |
134 CHECK(rules); | 133 CHECK(rules); |
135 // We do a lot of string assignment during parsing, but simplicity is more | 134 // We do a lot of string assignment during parsing, but simplicity is more |
136 // important than performance here. | 135 // important than performance here. |
137 std::string domain; | 136 std::string domain; |
138 NormalizeResult result = kSuccess; | 137 NormalizeResult result = kSuccess; |
139 size_t line_start = 0; | 138 size_t line_start = 0; |
140 size_t line_end = 0; | 139 size_t line_end = 0; |
141 bool is_private = false; | 140 bool is_private = false; |
142 RuleMap extra_rules; | 141 RuleMap extra_rules; |
143 int begin_private_length = arraysize(kBeginPrivateDomainsComment) - 1; | 142 int begin_private_length = arraysize(kBeginPrivateDomainsComment) - 1; |
144 int end_private_length = arraysize(kEndPrivateDomainsComment) - 1; | 143 int end_private_length = arraysize(kEndPrivateDomainsComment) - 1; |
145 while (line_start < data.size()) { | 144 while (line_start < data.size()) { |
146 if (line_start + begin_private_length < data.size() && | 145 if (line_start + begin_private_length < data.size() && |
147 !data.compare(line_start, begin_private_length, | 146 !data.compare( |
148 kBeginPrivateDomainsComment)) { | 147 line_start, begin_private_length, kBeginPrivateDomainsComment)) { |
149 is_private = true; | 148 is_private = true; |
150 line_end = line_start + begin_private_length; | 149 line_end = line_start + begin_private_length; |
151 } else if (line_start + end_private_length < data.size() && | 150 } else if (line_start + end_private_length < data.size() && |
152 !data.compare(line_start, end_private_length, | 151 !data.compare( |
153 kEndPrivateDomainsComment)) { | 152 line_start, end_private_length, kEndPrivateDomainsComment)) { |
154 is_private = false; | 153 is_private = false; |
155 line_end = line_start + end_private_length; | 154 line_end = line_start + end_private_length; |
156 } else if (line_start + 1 < data.size() && | 155 } else if (line_start + 1 < data.size() && data[line_start] == '/' && |
157 data[line_start] == '/' && | 156 data[line_start + 1] == '/') { |
158 data[line_start + 1] == '/') { | |
159 // Skip comments. | 157 // Skip comments. |
160 line_end = data.find_first_of("\r\n", line_start); | 158 line_end = data.find_first_of("\r\n", line_start); |
161 if (line_end == std::string::npos) | 159 if (line_end == std::string::npos) |
162 line_end = data.size(); | 160 line_end = data.size(); |
163 } else { | 161 } else { |
164 // Truncate at first whitespace. | 162 // Truncate at first whitespace. |
165 line_end = data.find_first_of("\r\n \t", line_start); | 163 line_end = data.find_first_of("\r\n \t", line_start); |
166 if (line_end == std::string::npos) | 164 if (line_end == std::string::npos) |
167 line_end = data.size(); | 165 line_end = data.size(); |
168 domain.assign(data.data(), line_start, line_end - line_start); | 166 domain.assign(data.data(), line_start, line_end - line_start); |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
243 NormalizeResult result = NormalizeDataToRuleMap(data, &rules); | 241 NormalizeResult result = NormalizeDataToRuleMap(data, &rules); |
244 | 242 |
245 if (!WriteRules(rules, out_filename)) { | 243 if (!WriteRules(rules, out_filename)) { |
246 LOG(ERROR) << "Error(s) writing output file"; | 244 LOG(ERROR) << "Error(s) writing output file"; |
247 result = kError; | 245 result = kError; |
248 } | 246 } |
249 | 247 |
250 return result; | 248 return result; |
251 } | 249 } |
252 | 250 |
253 | |
254 } // namespace tld_cleanup | 251 } // namespace tld_cleanup |
255 } // namespace net | 252 } // namespace net |
OLD | NEW |