OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/base/ip_address_number.h" | 5 #include "net/base/ip_address_number.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "base/strings/string_number_conversions.h" | 8 #include "base/strings/string_number_conversions.h" |
9 #include "base/strings/string_piece.h" | 9 #include "base/strings/string_piece.h" |
10 #include "base/strings/string_split.h" | 10 #include "base/strings/string_split.h" |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
149 } | 149 } |
150 | 150 |
151 // Otherwise, try IPv4. | 151 // Otherwise, try IPv4. |
152 ip_number->resize(4); // 32 bits. | 152 ip_number->resize(4); // 32 bits. |
153 int num_components; | 153 int num_components; |
154 url::CanonHostInfo::Family family = url::IPv4AddressToNumber( | 154 url::CanonHostInfo::Family family = url::IPv4AddressToNumber( |
155 hostname.data(), host_comp, &(*ip_number)[0], &num_components); | 155 hostname.data(), host_comp, &(*ip_number)[0], &num_components); |
156 return family == url::CanonHostInfo::IPV4; | 156 return family == url::CanonHostInfo::IPV4; |
157 } | 157 } |
158 | 158 |
159 bool ParseIPLiteralToNumber(const std::string& ip_literal, | 159 bool ParseIPLiteralToNumber(const base::StringPiece& ip_literal, |
160 IPAddressNumber* ip_number) { | 160 IPAddressNumber* ip_number) { |
161 // |ip_literal| could be either a IPv4 or an IPv6 literal. If it contains | 161 // |ip_literal| could be either a IPv4 or an IPv6 literal. If it contains |
162 // a colon however, it must be an IPv6 address. | 162 // a colon however, it must be an IPv6 address. |
163 if (ip_literal.find(':') != std::string::npos) { | 163 if (ip_literal.find(':') != base::StringPiece::npos) { |
164 // GURL expects IPv6 hostnames to be surrounded with brackets. | 164 // GURL expects IPv6 hostnames to be surrounded with brackets. |
165 std::string host_brackets = "[" + ip_literal + "]"; | 165 std::string host_brackets = "["; |
| 166 ip_literal.AppendToString(&host_brackets); |
| 167 host_brackets.push_back(']'); |
166 url::Component host_comp(0, host_brackets.size()); | 168 url::Component host_comp(0, host_brackets.size()); |
167 | 169 |
168 // Try parsing the hostname as an IPv6 literal. | 170 // Try parsing the hostname as an IPv6 literal. |
169 ip_number->resize(16); // 128 bits. | 171 ip_number->resize(16); // 128 bits. |
170 return url::IPv6AddressToNumber(host_brackets.data(), host_comp, | 172 return url::IPv6AddressToNumber(host_brackets.data(), host_comp, |
171 &(*ip_number)[0]); | 173 &(*ip_number)[0]); |
172 } | 174 } |
173 | 175 |
174 // Otherwise the string is an IPv4 address. | 176 // Otherwise the string is an IPv4 address. |
175 ip_number->resize(4); // 32 bits. | 177 ip_number->resize(4); // 32 bits. |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
215 address.end()); | 217 address.end()); |
216 } | 218 } |
217 | 219 |
218 bool ParseCIDRBlock(const std::string& cidr_literal, | 220 bool ParseCIDRBlock(const std::string& cidr_literal, |
219 IPAddressNumber* ip_number, | 221 IPAddressNumber* ip_number, |
220 size_t* prefix_length_in_bits) { | 222 size_t* prefix_length_in_bits) { |
221 // We expect CIDR notation to match one of these two templates: | 223 // We expect CIDR notation to match one of these two templates: |
222 // <IPv4-literal> "/" <number of bits> | 224 // <IPv4-literal> "/" <number of bits> |
223 // <IPv6-literal> "/" <number of bits> | 225 // <IPv6-literal> "/" <number of bits> |
224 | 226 |
225 std::vector<std::string> parts; | 227 std::vector<base::StringPiece> parts = base::SplitStringPiece( |
226 base::SplitString(cidr_literal, '/', &parts); | 228 cidr_literal, "/", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL); |
227 if (parts.size() != 2) | 229 if (parts.size() != 2) |
228 return false; | 230 return false; |
229 | 231 |
230 // Parse the IP address. | 232 // Parse the IP address. |
231 if (!ParseIPLiteralToNumber(parts[0], ip_number)) | 233 if (!ParseIPLiteralToNumber(parts[0], ip_number)) |
232 return false; | 234 return false; |
233 | 235 |
234 // Parse the prefix length. | 236 // Parse the prefix length. |
235 int number_of_bits = -1; | 237 int number_of_bits = -1; |
236 if (!base::StringToInt(parts[1], &number_of_bits)) | 238 if (!base::StringToInt(parts[1], &number_of_bits)) |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
286 } | 288 } |
287 return a1.size() * CHAR_BIT; | 289 return a1.size() * CHAR_BIT; |
288 } | 290 } |
289 | 291 |
290 unsigned MaskPrefixLength(const IPAddressNumber& mask) { | 292 unsigned MaskPrefixLength(const IPAddressNumber& mask) { |
291 IPAddressNumber all_ones(mask.size(), 0xFF); | 293 IPAddressNumber all_ones(mask.size(), 0xFF); |
292 return CommonPrefixLength(mask, all_ones); | 294 return CommonPrefixLength(mask, all_ones); |
293 } | 295 } |
294 | 296 |
295 } // namespace net | 297 } // namespace net |
OLD | NEW |