blob: e9f5b2227222f390ddd019c0d0906aa97012cf65 [file] [log] [blame]
[email protected]51bcc5d2013-04-24 01:41:371// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
[email protected]e7bba5f82013-04-10 20:10:524
5// Functions for canonicalizing "filesystem:file:" URLs.
6
[email protected]318076b2013-04-18 21:19:457#include "url/url_canon.h"
8#include "url/url_canon_internal.h"
9#include "url/url_file.h"
10#include "url/url_parse_internal.h"
11#include "url/url_util.h"
12#include "url/url_util_internal.h"
[email protected]e7bba5f82013-04-10 20:10:5213
[email protected]0318f922014-04-22 00:09:2314namespace url {
[email protected]e7bba5f82013-04-10 20:10:5215
16namespace {
17
18// We use the URLComponentSource for the outer URL, as it can have replacements,
19// whereas the inner_url can't, so it uses spec.
20template<typename CHAR, typename UCHAR>
21bool DoCanonicalizeFileSystemURL(const CHAR* spec,
22 const URLComponentSource<CHAR>& source,
[email protected]0318f922014-04-22 00:09:2323 const Parsed& parsed,
[email protected]e7bba5f82013-04-10 20:10:5224 CharsetConverter* charset_converter,
25 CanonOutput* output,
[email protected]0318f922014-04-22 00:09:2326 Parsed* new_parsed) {
[email protected]e7bba5f82013-04-10 20:10:5227 // filesystem only uses {scheme, path, query, ref} -- clear the rest.
[email protected]e7ee68f72014-04-08 23:36:0628 new_parsed->username.reset();
29 new_parsed->password.reset();
30 new_parsed->host.reset();
31 new_parsed->port.reset();
[email protected]e7bba5f82013-04-10 20:10:5232
[email protected]0318f922014-04-22 00:09:2333 const Parsed* inner_parsed = parsed.inner_parsed();
34 Parsed new_inner_parsed;
[email protected]e7bba5f82013-04-10 20:10:5235
36 // Scheme (known, so we don't bother running it through the more
37 // complicated scheme canonicalizer).
38 new_parsed->scheme.begin = output->length();
39 output->Append("filesystem:", 11);
40 new_parsed->scheme.len = 10;
41
42 if (!parsed.inner_parsed() || !parsed.inner_parsed()->scheme.is_valid())
43 return false;
44
45 bool success = true;
Nick Carterff69a102018-04-04 00:15:1746 SchemeType inner_scheme_type = SCHEME_WITH_HOST_PORT_AND_USER_INFORMATION;
[email protected]cca6f392014-05-28 21:32:2647 if (CompareSchemeComponent(spec, inner_parsed->scheme, url::kFileScheme)) {
[email protected]e7bba5f82013-04-10 20:10:5248 new_inner_parsed.scheme.begin = output->length();
49 output->Append("file://", 7);
50 new_inner_parsed.scheme.len = 4;
51 success &= CanonicalizePath(spec, inner_parsed->path, output,
52 &new_inner_parsed.path);
Nick Carterff69a102018-04-04 00:15:1753 } else if (GetStandardSchemeType(spec, inner_parsed->scheme,
54 &inner_scheme_type)) {
55 if (inner_scheme_type == SCHEME_WITH_HOST_PORT_AND_USER_INFORMATION) {
56 // Strip out the user information from the inner URL, if any.
57 inner_scheme_type = SCHEME_WITH_HOST_AND_PORT;
58 }
59 success = CanonicalizeStandardURL(
60 spec, parsed.inner_parsed()->Length(), *parsed.inner_parsed(),
61 inner_scheme_type, charset_converter, output, &new_inner_parsed);
[email protected]e7bba5f82013-04-10 20:10:5262 } else {
63 // TODO(ericu): The URL is wrong, but should we try to output more of what
64 // we were given? Echoing back filesystem:mailto etc. doesn't seem all that
65 // useful.
66 return false;
67 }
68 // The filesystem type must be more than just a leading slash for validity.
69 success &= parsed.inner_parsed()->path.len > 1;
70
71 success &= CanonicalizePath(source.path, parsed.path, output,
72 &new_parsed->path);
73
74 // Ignore failures for query/ref since the URL can probably still be loaded.
75 CanonicalizeQuery(source.query, parsed.query, charset_converter,
76 output, &new_parsed->query);
77 CanonicalizeRef(source.ref, parsed.ref, output, &new_parsed->ref);
78 if (success)
79 new_parsed->set_inner_parsed(new_inner_parsed);
80
81 return success;
82}
83
84} // namespace
85
86bool CanonicalizeFileSystemURL(const char* spec,
87 int spec_len,
[email protected]0318f922014-04-22 00:09:2388 const Parsed& parsed,
[email protected]e7bba5f82013-04-10 20:10:5289 CharsetConverter* charset_converter,
90 CanonOutput* output,
[email protected]0318f922014-04-22 00:09:2391 Parsed* new_parsed) {
[email protected]e7bba5f82013-04-10 20:10:5292 return DoCanonicalizeFileSystemURL<char, unsigned char>(
93 spec, URLComponentSource<char>(spec), parsed, charset_converter, output,
94 new_parsed);
95}
96
[email protected]3774f832013-06-11 21:21:5797bool CanonicalizeFileSystemURL(const base::char16* spec,
[email protected]e7bba5f82013-04-10 20:10:5298 int spec_len,
[email protected]0318f922014-04-22 00:09:2399 const Parsed& parsed,
[email protected]e7bba5f82013-04-10 20:10:52100 CharsetConverter* charset_converter,
101 CanonOutput* output,
[email protected]0318f922014-04-22 00:09:23102 Parsed* new_parsed) {
[email protected]3774f832013-06-11 21:21:57103 return DoCanonicalizeFileSystemURL<base::char16, base::char16>(
104 spec, URLComponentSource<base::char16>(spec), parsed, charset_converter,
105 output, new_parsed);
[email protected]e7bba5f82013-04-10 20:10:52106}
107
108bool ReplaceFileSystemURL(const char* base,
[email protected]0318f922014-04-22 00:09:23109 const Parsed& base_parsed,
[email protected]e7bba5f82013-04-10 20:10:52110 const Replacements<char>& replacements,
111 CharsetConverter* charset_converter,
112 CanonOutput* output,
[email protected]0318f922014-04-22 00:09:23113 Parsed* new_parsed) {
[email protected]e7bba5f82013-04-10 20:10:52114 URLComponentSource<char> source(base);
[email protected]0318f922014-04-22 00:09:23115 Parsed parsed(base_parsed);
[email protected]e7bba5f82013-04-10 20:10:52116 SetupOverrideComponents(base, replacements, &source, &parsed);
117 return DoCanonicalizeFileSystemURL<char, unsigned char>(
118 base, source, parsed, charset_converter, output, new_parsed);
119}
120
121bool ReplaceFileSystemURL(const char* base,
[email protected]0318f922014-04-22 00:09:23122 const Parsed& base_parsed,
[email protected]3774f832013-06-11 21:21:57123 const Replacements<base::char16>& replacements,
[email protected]e7bba5f82013-04-10 20:10:52124 CharsetConverter* charset_converter,
125 CanonOutput* output,
[email protected]0318f922014-04-22 00:09:23126 Parsed* new_parsed) {
[email protected]e7bba5f82013-04-10 20:10:52127 RawCanonOutput<1024> utf8;
128 URLComponentSource<char> source(base);
[email protected]0318f922014-04-22 00:09:23129 Parsed parsed(base_parsed);
[email protected]e7bba5f82013-04-10 20:10:52130 SetupUTF16OverrideComponents(base, replacements, &utf8, &source, &parsed);
131 return DoCanonicalizeFileSystemURL<char, unsigned char>(
132 base, source, parsed, charset_converter, output, new_parsed);
133}
134
[email protected]0318f922014-04-22 00:09:23135} // namespace url