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/url_util.h" | 5 #include "url/url_util.h" |
6 | 6 |
7 #include <string.h> | 7 #include <string.h> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
114 *found_scheme = url_parse::Component(); | 114 *found_scheme = url_parse::Component(); |
115 return false; | 115 return false; |
116 } | 116 } |
117 if (found_scheme) | 117 if (found_scheme) |
118 *found_scheme = our_scheme; | 118 *found_scheme = our_scheme; |
119 return DoCompareSchemeComponent(spec, our_scheme, compare); | 119 return DoCompareSchemeComponent(spec, our_scheme, compare); |
120 } | 120 } |
121 | 121 |
122 template<typename CHAR> | 122 template<typename CHAR> |
123 bool DoCanonicalize(const CHAR* in_spec, int in_spec_len, | 123 bool DoCanonicalize(const CHAR* in_spec, int in_spec_len, |
| 124 bool trim_path_end, |
124 url_canon::CharsetConverter* charset_converter, | 125 url_canon::CharsetConverter* charset_converter, |
125 url_canon::CanonOutput* output, | 126 url_canon::CanonOutput* output, |
126 url_parse::Parsed* output_parsed) { | 127 url_parse::Parsed* output_parsed) { |
127 // Remove any whitespace from the middle of the relative URL, possibly | 128 // Remove any whitespace from the middle of the relative URL, possibly |
128 // copying to the new buffer. | 129 // copying to the new buffer. |
129 url_canon::RawCanonOutputT<CHAR> whitespace_buffer; | 130 url_canon::RawCanonOutputT<CHAR> whitespace_buffer; |
130 int spec_len; | 131 int spec_len; |
131 const CHAR* spec = RemoveURLWhitespace(in_spec, in_spec_len, | 132 const CHAR* spec = RemoveURLWhitespace(in_spec, in_spec_len, |
132 &whitespace_buffer, &spec_len); | 133 &whitespace_buffer, &spec_len); |
133 | 134 |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
181 output, output_parsed); | 182 output, output_parsed); |
182 | 183 |
183 } else if (DoCompareSchemeComponent(spec, scheme, kMailtoScheme)) { | 184 } else if (DoCompareSchemeComponent(spec, scheme, kMailtoScheme)) { |
184 // Mailto are treated like a standard url with only a scheme, path, query | 185 // Mailto are treated like a standard url with only a scheme, path, query |
185 url_parse::ParseMailtoURL(spec, spec_len, &parsed_input); | 186 url_parse::ParseMailtoURL(spec, spec_len, &parsed_input); |
186 success = url_canon::CanonicalizeMailtoURL(spec, spec_len, parsed_input, | 187 success = url_canon::CanonicalizeMailtoURL(spec, spec_len, parsed_input, |
187 output, output_parsed); | 188 output, output_parsed); |
188 | 189 |
189 } else { | 190 } else { |
190 // "Weird" URLs like data: and javascript: | 191 // "Weird" URLs like data: and javascript: |
191 url_parse::ParsePathURL(spec, spec_len, &parsed_input); | 192 url_parse::ParsePathURL(spec, spec_len, trim_path_end, &parsed_input); |
192 success = url_canon::CanonicalizePathURL(spec, spec_len, parsed_input, | 193 success = url_canon::CanonicalizePathURL(spec, spec_len, parsed_input, |
193 output, output_parsed); | 194 output, output_parsed); |
194 } | 195 } |
195 return success; | 196 return success; |
196 } | 197 } |
197 | 198 |
198 template<typename CHAR> | 199 template<typename CHAR> |
199 bool DoResolveRelative(const char* base_spec, | 200 bool DoResolveRelative(const char* base_spec, |
200 int base_spec_len, | 201 int base_spec_len, |
201 const url_parse::Parsed& base_parsed, | 202 const url_parse::Parsed& base_parsed, |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
245 ParseStandardURL(base_spec, base_spec_len, &base_parsed_authority); | 246 ParseStandardURL(base_spec, base_spec_len, &base_parsed_authority); |
246 if (base_parsed_authority.host.is_nonempty()) { | 247 if (base_parsed_authority.host.is_nonempty()) { |
247 bool did_resolve_succeed = | 248 bool did_resolve_succeed = |
248 url_canon::ResolveRelativeURL(base_spec, base_parsed_authority, | 249 url_canon::ResolveRelativeURL(base_spec, base_parsed_authority, |
249 false, relative, | 250 false, relative, |
250 relative_component, charset_converter, | 251 relative_component, charset_converter, |
251 output, output_parsed); | 252 output, output_parsed); |
252 // The output_parsed is incorrect at this point (because it was built | 253 // The output_parsed is incorrect at this point (because it was built |
253 // based on base_parsed_authority instead of base_parsed) and needs to be | 254 // based on base_parsed_authority instead of base_parsed) and needs to be |
254 // re-created. | 255 // re-created. |
255 ParsePathURL(output->data(), output->length(), output_parsed); | 256 ParsePathURL(output->data(), output->length(), true, |
| 257 output_parsed); |
256 return did_resolve_succeed; | 258 return did_resolve_succeed; |
257 } | 259 } |
258 } else if (is_relative) { | 260 } else if (is_relative) { |
259 // Relative, resolve and canonicalize. | 261 // Relative, resolve and canonicalize. |
260 bool file_base_scheme = base_parsed.scheme.is_nonempty() && | 262 bool file_base_scheme = base_parsed.scheme.is_nonempty() && |
261 DoCompareSchemeComponent(base_spec, base_parsed.scheme, kFileScheme); | 263 DoCompareSchemeComponent(base_spec, base_parsed.scheme, kFileScheme); |
262 return url_canon::ResolveRelativeURL(base_spec, base_parsed, | 264 return url_canon::ResolveRelativeURL(base_spec, base_parsed, |
263 file_base_scheme, relative, | 265 file_base_scheme, relative, |
264 relative_component, charset_converter, | 266 relative_component, charset_converter, |
265 output, output_parsed); | 267 output, output_parsed); |
266 } | 268 } |
267 | 269 |
268 // Not relative, canonicalize the input. | 270 // Not relative, canonicalize the input. |
269 return DoCanonicalize(relative, relative_length, charset_converter, | 271 return DoCanonicalize(relative, relative_length, true, charset_converter, |
270 output, output_parsed); | 272 output, output_parsed); |
271 } | 273 } |
272 | 274 |
273 template<typename CHAR> | 275 template<typename CHAR> |
274 bool DoReplaceComponents(const char* spec, | 276 bool DoReplaceComponents(const char* spec, |
275 int spec_len, | 277 int spec_len, |
276 const url_parse::Parsed& parsed, | 278 const url_parse::Parsed& parsed, |
277 const url_canon::Replacements<CHAR>& replacements, | 279 const url_canon::Replacements<CHAR>& replacements, |
278 url_canon::CharsetConverter* charset_converter, | 280 url_canon::CharsetConverter* charset_converter, |
279 url_canon::CanonOutput* output, | 281 url_canon::CanonOutput* output, |
(...skipping 27 matching lines...) Expand all Loading... |
307 : 1; | 309 : 1; |
308 if (spec_len - spec_after_colon > 0) { | 310 if (spec_len - spec_after_colon > 0) { |
309 scheme_replaced.Append(&spec[spec_after_colon], | 311 scheme_replaced.Append(&spec[spec_after_colon], |
310 spec_len - spec_after_colon); | 312 spec_len - spec_after_colon); |
311 } | 313 } |
312 | 314 |
313 // We now need to completely re-parse the resulting string since its meaning | 315 // We now need to completely re-parse the resulting string since its meaning |
314 // may have changed with the different scheme. | 316 // may have changed with the different scheme. |
315 url_canon::RawCanonOutput<128> recanonicalized; | 317 url_canon::RawCanonOutput<128> recanonicalized; |
316 url_parse::Parsed recanonicalized_parsed; | 318 url_parse::Parsed recanonicalized_parsed; |
317 DoCanonicalize(scheme_replaced.data(), scheme_replaced.length(), | 319 DoCanonicalize(scheme_replaced.data(), scheme_replaced.length(), true, |
318 charset_converter, | 320 charset_converter, |
319 &recanonicalized, &recanonicalized_parsed); | 321 &recanonicalized, &recanonicalized_parsed); |
320 | 322 |
321 // Recurse using the version with the scheme already replaced. This will now | 323 // Recurse using the version with the scheme already replaced. This will now |
322 // use the replacement rules for the new scheme. | 324 // use the replacement rules for the new scheme. |
323 // | 325 // |
324 // Warning: this code assumes that ReplaceComponents will re-check all | 326 // Warning: this code assumes that ReplaceComponents will re-check all |
325 // components for validity. This is because we can't fail if DoCanonicalize | 327 // components for validity. This is because we can't fail if DoCanonicalize |
326 // failed above since theoretically the thing making it fail could be | 328 // failed above since theoretically the thing making it fail could be |
327 // getting replaced here. If ReplaceComponents didn't re-check everything, | 329 // getting replaced here. If ReplaceComponents didn't re-check everything, |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
422 | 424 |
423 bool FindAndCompareScheme(const base::char16* str, | 425 bool FindAndCompareScheme(const base::char16* str, |
424 int str_len, | 426 int str_len, |
425 const char* compare, | 427 const char* compare, |
426 url_parse::Component* found_scheme) { | 428 url_parse::Component* found_scheme) { |
427 return DoFindAndCompareScheme(str, str_len, compare, found_scheme); | 429 return DoFindAndCompareScheme(str, str_len, compare, found_scheme); |
428 } | 430 } |
429 | 431 |
430 bool Canonicalize(const char* spec, | 432 bool Canonicalize(const char* spec, |
431 int spec_len, | 433 int spec_len, |
| 434 bool trim_path_end, |
432 url_canon::CharsetConverter* charset_converter, | 435 url_canon::CharsetConverter* charset_converter, |
433 url_canon::CanonOutput* output, | 436 url_canon::CanonOutput* output, |
434 url_parse::Parsed* output_parsed) { | 437 url_parse::Parsed* output_parsed) { |
435 return DoCanonicalize(spec, spec_len, charset_converter, | 438 return DoCanonicalize(spec, spec_len, trim_path_end, charset_converter, |
436 output, output_parsed); | 439 output, output_parsed); |
437 } | 440 } |
438 | 441 |
439 bool Canonicalize(const base::char16* spec, | 442 bool Canonicalize(const base::char16* spec, |
440 int spec_len, | 443 int spec_len, |
| 444 bool trim_path_end, |
441 url_canon::CharsetConverter* charset_converter, | 445 url_canon::CharsetConverter* charset_converter, |
442 url_canon::CanonOutput* output, | 446 url_canon::CanonOutput* output, |
443 url_parse::Parsed* output_parsed) { | 447 url_parse::Parsed* output_parsed) { |
444 return DoCanonicalize(spec, spec_len, charset_converter, | 448 return DoCanonicalize(spec, spec_len, trim_path_end, charset_converter, |
445 output, output_parsed); | 449 output, output_parsed); |
446 } | 450 } |
447 | 451 |
448 bool ResolveRelative(const char* base_spec, | 452 bool ResolveRelative(const char* base_spec, |
449 int base_spec_len, | 453 int base_spec_len, |
450 const url_parse::Parsed& base_parsed, | 454 const url_parse::Parsed& base_parsed, |
451 const char* relative, | 455 const char* relative, |
452 int relative_length, | 456 int relative_length, |
453 url_canon::CharsetConverter* charset_converter, | 457 url_canon::CharsetConverter* charset_converter, |
454 url_canon::CanonOutput* output, | 458 url_canon::CanonOutput* output, |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
585 return DoCompareSchemeComponent(spec, component, compare_to); | 589 return DoCompareSchemeComponent(spec, component, compare_to); |
586 } | 590 } |
587 | 591 |
588 bool CompareSchemeComponent(const base::char16* spec, | 592 bool CompareSchemeComponent(const base::char16* spec, |
589 const url_parse::Component& component, | 593 const url_parse::Component& component, |
590 const char* compare_to) { | 594 const char* compare_to) { |
591 return DoCompareSchemeComponent(spec, component, compare_to); | 595 return DoCompareSchemeComponent(spec, component, compare_to); |
592 } | 596 } |
593 | 597 |
594 } // namespace url_util | 598 } // namespace url_util |
OLD | NEW |