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 "url/gurl.h" | 5 #include "url/gurl.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 #include <ostream> | 10 #include <ostream> |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
114 url::StdStringCanonOutput output(&spec_); | 114 url::StdStringCanonOutput output(&spec_); |
115 is_valid_ = url::Canonicalize( | 115 is_valid_ = url::Canonicalize( |
116 input_spec.data(), static_cast<int>(input_spec.length()), trim_path_end, | 116 input_spec.data(), static_cast<int>(input_spec.length()), trim_path_end, |
117 NULL, &output, &parsed_); | 117 NULL, &output, &parsed_); |
118 | 118 |
119 output.Complete(); // Must be done before using string. | 119 output.Complete(); // Must be done before using string. |
120 if (is_valid_ && SchemeIsFileSystem()) { | 120 if (is_valid_ && SchemeIsFileSystem()) { |
121 inner_url_.reset(new GURL(spec_.data(), parsed_.Length(), | 121 inner_url_.reset(new GURL(spec_.data(), parsed_.Length(), |
122 *parsed_.inner_parsed(), true)); | 122 *parsed_.inner_parsed(), true)); |
123 } | 123 } |
| 124 // Valid URLs always have non-empty specs. |
| 125 DCHECK(!is_valid_ || !spec_.empty()); |
124 } | 126 } |
125 | 127 |
126 void GURL::InitializeFromCanonicalSpec() { | 128 void GURL::InitializeFromCanonicalSpec() { |
127 if (is_valid_ && SchemeIsFileSystem()) { | 129 if (is_valid_ && SchemeIsFileSystem()) { |
128 inner_url_.reset( | 130 inner_url_.reset( |
129 new GURL(spec_.data(), parsed_.Length(), | 131 new GURL(spec_.data(), parsed_.Length(), |
130 *parsed_.inner_parsed(), true)); | 132 *parsed_.inner_parsed(), true)); |
131 } | 133 } |
132 | 134 |
133 #ifndef NDEBUG | 135 #ifndef NDEBUG |
134 // For testing purposes, check that the parsed canonical URL is identical to | 136 // For testing purposes, check that the parsed canonical URL is identical to |
135 // what we would have produced. Skip checking for invalid URLs have no meaning | 137 // what we would have produced. Skip checking for invalid URLs have no meaning |
136 // and we can't always canonicalize then reproducibly. | 138 // and we can't always canonicalize then reproducibly. |
137 if (is_valid_) { | 139 if (is_valid_) { |
| 140 DCHECK(!spec_.empty()); |
138 url::Component scheme; | 141 url::Component scheme; |
139 // We can't do this check on the inner_url of a filesystem URL, as | 142 // We can't do this check on the inner_url of a filesystem URL, as |
140 // canonical_spec actually points to the start of the outer URL, so we'd | 143 // canonical_spec actually points to the start of the outer URL, so we'd |
141 // end up with infinite recursion in this constructor. | 144 // end up with infinite recursion in this constructor. |
142 if (!url::FindAndCompareScheme(spec_.data(), spec_.length(), | 145 if (!url::FindAndCompareScheme(spec_.data(), spec_.length(), |
143 url::kFileSystemScheme, &scheme) || | 146 url::kFileSystemScheme, &scheme) || |
144 scheme.begin == parsed_.scheme.begin) { | 147 scheme.begin == parsed_.scheme.begin) { |
145 // We need to retain trailing whitespace on path URLs, as the |parsed_| | 148 // We need to retain trailing whitespace on path URLs, as the |parsed_| |
146 // spec we originally received may legitimately contain trailing white- | 149 // spec we originally received may legitimately contain trailing white- |
147 // space on the path or components e.g. if the #ref has been | 150 // space on the path or components e.g. if the #ref has been |
(...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
433 h.len -= 2; | 436 h.len -= 2; |
434 } | 437 } |
435 return ComponentString(h); | 438 return ComponentString(h); |
436 } | 439 } |
437 | 440 |
438 std::string GURL::GetContent() const { | 441 std::string GURL::GetContent() const { |
439 return is_valid_ ? ComponentString(parsed_.GetContent()) : std::string(); | 442 return is_valid_ ? ComponentString(parsed_.GetContent()) : std::string(); |
440 } | 443 } |
441 | 444 |
442 bool GURL::HostIsIPAddress() const { | 445 bool GURL::HostIsIPAddress() const { |
443 if (!is_valid_ || spec_.empty()) | 446 return is_valid_ && url::HostIsIPAddress(host_piece()); |
444 return false; | |
445 | |
446 url::RawCanonOutputT<char, 128> ignored_output; | |
447 url::CanonHostInfo host_info; | |
448 url::CanonicalizeIPAddress(spec_.c_str(), parsed_.host, &ignored_output, | |
449 &host_info); | |
450 return host_info.IsIPAddress(); | |
451 } | 447 } |
452 | 448 |
453 #ifdef WIN32 | 449 #ifdef WIN32 |
454 | 450 |
455 const GURL& GURL::EmptyGURL() { | 451 const GURL& GURL::EmptyGURL() { |
456 // Avoid static object construction/destruction on startup/shutdown. | 452 // Avoid static object construction/destruction on startup/shutdown. |
457 if (!empty_gurl) { | 453 if (!empty_gurl) { |
458 // Create the string. Be careful that we don't break in the case that this | 454 // Create the string. Be careful that we don't break in the case that this |
459 // is being called from multiple threads. | 455 // is being called from multiple threads. |
460 GURL* new_empty_gurl = new GURL; | 456 GURL* new_empty_gurl = new GURL; |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
512 } | 508 } |
513 | 509 |
514 bool operator==(const GURL& x, const base::StringPiece& spec) { | 510 bool operator==(const GURL& x, const base::StringPiece& spec) { |
515 DCHECK_EQ(GURL(spec).possibly_invalid_spec(), spec); | 511 DCHECK_EQ(GURL(spec).possibly_invalid_spec(), spec); |
516 return x.possibly_invalid_spec() == spec; | 512 return x.possibly_invalid_spec() == spec; |
517 } | 513 } |
518 | 514 |
519 bool operator!=(const GURL& x, const base::StringPiece& spec) { | 515 bool operator!=(const GURL& x, const base::StringPiece& spec) { |
520 return !(x == spec); | 516 return !(x == spec); |
521 } | 517 } |
OLD | NEW |