1*6777b538SAndroid Build Coastguard Worker // Copyright 2013 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker // Functions for canonicalizing "filesystem:file:" URLs.
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Worker #include "url/url_canon.h"
8*6777b538SAndroid Build Coastguard Worker #include "url/url_canon_internal.h"
9*6777b538SAndroid Build Coastguard Worker #include "url/url_file.h"
10*6777b538SAndroid Build Coastguard Worker #include "url/url_parse_internal.h"
11*6777b538SAndroid Build Coastguard Worker #include "url/url_util.h"
12*6777b538SAndroid Build Coastguard Worker #include "url/url_util_internal.h"
13*6777b538SAndroid Build Coastguard Worker
14*6777b538SAndroid Build Coastguard Worker namespace url {
15*6777b538SAndroid Build Coastguard Worker
16*6777b538SAndroid Build Coastguard Worker namespace {
17*6777b538SAndroid Build Coastguard Worker
18*6777b538SAndroid Build Coastguard Worker // We use the URLComponentSource for the outer URL, as it can have replacements,
19*6777b538SAndroid Build Coastguard Worker // whereas the inner_url can't, so it uses spec.
20*6777b538SAndroid Build Coastguard Worker template <typename CHAR>
DoCanonicalizeFileSystemURL(const CHAR * spec,const URLComponentSource<CHAR> & source,const Parsed & parsed,CharsetConverter * charset_converter,CanonOutput * output,Parsed * new_parsed)21*6777b538SAndroid Build Coastguard Worker bool DoCanonicalizeFileSystemURL(const CHAR* spec,
22*6777b538SAndroid Build Coastguard Worker const URLComponentSource<CHAR>& source,
23*6777b538SAndroid Build Coastguard Worker const Parsed& parsed,
24*6777b538SAndroid Build Coastguard Worker CharsetConverter* charset_converter,
25*6777b538SAndroid Build Coastguard Worker CanonOutput* output,
26*6777b538SAndroid Build Coastguard Worker Parsed* new_parsed) {
27*6777b538SAndroid Build Coastguard Worker // filesystem only uses {scheme, path, query, ref} -- clear the rest.
28*6777b538SAndroid Build Coastguard Worker new_parsed->username.reset();
29*6777b538SAndroid Build Coastguard Worker new_parsed->password.reset();
30*6777b538SAndroid Build Coastguard Worker new_parsed->host.reset();
31*6777b538SAndroid Build Coastguard Worker new_parsed->port.reset();
32*6777b538SAndroid Build Coastguard Worker
33*6777b538SAndroid Build Coastguard Worker const Parsed* inner_parsed = parsed.inner_parsed();
34*6777b538SAndroid Build Coastguard Worker Parsed new_inner_parsed;
35*6777b538SAndroid Build Coastguard Worker
36*6777b538SAndroid Build Coastguard Worker // Scheme (known, so we don't bother running it through the more
37*6777b538SAndroid Build Coastguard Worker // complicated scheme canonicalizer).
38*6777b538SAndroid Build Coastguard Worker new_parsed->scheme.begin = output->length();
39*6777b538SAndroid Build Coastguard Worker output->Append("filesystem:");
40*6777b538SAndroid Build Coastguard Worker new_parsed->scheme.len = 10;
41*6777b538SAndroid Build Coastguard Worker
42*6777b538SAndroid Build Coastguard Worker if (!inner_parsed || !inner_parsed->scheme.is_valid())
43*6777b538SAndroid Build Coastguard Worker return false;
44*6777b538SAndroid Build Coastguard Worker
45*6777b538SAndroid Build Coastguard Worker bool success = true;
46*6777b538SAndroid Build Coastguard Worker SchemeType inner_scheme_type = SCHEME_WITH_HOST_PORT_AND_USER_INFORMATION;
47*6777b538SAndroid Build Coastguard Worker if (CompareSchemeComponent(spec, inner_parsed->scheme, url::kFileScheme)) {
48*6777b538SAndroid Build Coastguard Worker new_inner_parsed.scheme.begin = output->length();
49*6777b538SAndroid Build Coastguard Worker output->Append("file://");
50*6777b538SAndroid Build Coastguard Worker new_inner_parsed.scheme.len = 4;
51*6777b538SAndroid Build Coastguard Worker success &= CanonicalizePath(spec, inner_parsed->path, output,
52*6777b538SAndroid Build Coastguard Worker &new_inner_parsed.path);
53*6777b538SAndroid Build Coastguard Worker } else if (GetStandardSchemeType(spec, inner_parsed->scheme,
54*6777b538SAndroid Build Coastguard Worker &inner_scheme_type)) {
55*6777b538SAndroid Build Coastguard Worker if (inner_scheme_type == SCHEME_WITH_HOST_PORT_AND_USER_INFORMATION) {
56*6777b538SAndroid Build Coastguard Worker // Strip out the user information from the inner URL, if any.
57*6777b538SAndroid Build Coastguard Worker inner_scheme_type = SCHEME_WITH_HOST_AND_PORT;
58*6777b538SAndroid Build Coastguard Worker }
59*6777b538SAndroid Build Coastguard Worker success =
60*6777b538SAndroid Build Coastguard Worker CanonicalizeStandardURL(spec, *inner_parsed, inner_scheme_type,
61*6777b538SAndroid Build Coastguard Worker charset_converter, output, &new_inner_parsed);
62*6777b538SAndroid Build Coastguard Worker } else {
63*6777b538SAndroid Build Coastguard Worker // TODO(ericu): The URL is wrong, but should we try to output more of what
64*6777b538SAndroid Build Coastguard Worker // we were given? Echoing back filesystem:mailto etc. doesn't seem all that
65*6777b538SAndroid Build Coastguard Worker // useful.
66*6777b538SAndroid Build Coastguard Worker return false;
67*6777b538SAndroid Build Coastguard Worker }
68*6777b538SAndroid Build Coastguard Worker // The filesystem type must be more than just a leading slash for validity.
69*6777b538SAndroid Build Coastguard Worker success &= new_inner_parsed.path.len > 1;
70*6777b538SAndroid Build Coastguard Worker
71*6777b538SAndroid Build Coastguard Worker success &= CanonicalizePath(source.path, parsed.path, output,
72*6777b538SAndroid Build Coastguard Worker &new_parsed->path);
73*6777b538SAndroid Build Coastguard Worker
74*6777b538SAndroid Build Coastguard Worker // Ignore failures for query/ref since the URL can probably still be loaded.
75*6777b538SAndroid Build Coastguard Worker CanonicalizeQuery(source.query, parsed.query, charset_converter,
76*6777b538SAndroid Build Coastguard Worker output, &new_parsed->query);
77*6777b538SAndroid Build Coastguard Worker CanonicalizeRef(source.ref, parsed.ref, output, &new_parsed->ref);
78*6777b538SAndroid Build Coastguard Worker if (success)
79*6777b538SAndroid Build Coastguard Worker new_parsed->set_inner_parsed(new_inner_parsed);
80*6777b538SAndroid Build Coastguard Worker
81*6777b538SAndroid Build Coastguard Worker return success;
82*6777b538SAndroid Build Coastguard Worker }
83*6777b538SAndroid Build Coastguard Worker
84*6777b538SAndroid Build Coastguard Worker } // namespace
85*6777b538SAndroid Build Coastguard Worker
CanonicalizeFileSystemURL(const char * spec,const Parsed & parsed,CharsetConverter * charset_converter,CanonOutput * output,Parsed * new_parsed)86*6777b538SAndroid Build Coastguard Worker bool CanonicalizeFileSystemURL(const char* spec,
87*6777b538SAndroid Build Coastguard Worker const Parsed& parsed,
88*6777b538SAndroid Build Coastguard Worker CharsetConverter* charset_converter,
89*6777b538SAndroid Build Coastguard Worker CanonOutput* output,
90*6777b538SAndroid Build Coastguard Worker Parsed* new_parsed) {
91*6777b538SAndroid Build Coastguard Worker return DoCanonicalizeFileSystemURL(spec, URLComponentSource(spec), parsed,
92*6777b538SAndroid Build Coastguard Worker charset_converter, output, new_parsed);
93*6777b538SAndroid Build Coastguard Worker }
94*6777b538SAndroid Build Coastguard Worker
CanonicalizeFileSystemURL(const char16_t * spec,const Parsed & parsed,CharsetConverter * charset_converter,CanonOutput * output,Parsed * new_parsed)95*6777b538SAndroid Build Coastguard Worker bool CanonicalizeFileSystemURL(const char16_t* spec,
96*6777b538SAndroid Build Coastguard Worker const Parsed& parsed,
97*6777b538SAndroid Build Coastguard Worker CharsetConverter* charset_converter,
98*6777b538SAndroid Build Coastguard Worker CanonOutput* output,
99*6777b538SAndroid Build Coastguard Worker Parsed* new_parsed) {
100*6777b538SAndroid Build Coastguard Worker return DoCanonicalizeFileSystemURL(spec, URLComponentSource(spec), parsed,
101*6777b538SAndroid Build Coastguard Worker charset_converter, output, new_parsed);
102*6777b538SAndroid Build Coastguard Worker }
103*6777b538SAndroid Build Coastguard Worker
ReplaceFileSystemURL(const char * base,const Parsed & base_parsed,const Replacements<char> & replacements,CharsetConverter * charset_converter,CanonOutput * output,Parsed * new_parsed)104*6777b538SAndroid Build Coastguard Worker bool ReplaceFileSystemURL(const char* base,
105*6777b538SAndroid Build Coastguard Worker const Parsed& base_parsed,
106*6777b538SAndroid Build Coastguard Worker const Replacements<char>& replacements,
107*6777b538SAndroid Build Coastguard Worker CharsetConverter* charset_converter,
108*6777b538SAndroid Build Coastguard Worker CanonOutput* output,
109*6777b538SAndroid Build Coastguard Worker Parsed* new_parsed) {
110*6777b538SAndroid Build Coastguard Worker URLComponentSource<char> source(base);
111*6777b538SAndroid Build Coastguard Worker Parsed parsed(base_parsed);
112*6777b538SAndroid Build Coastguard Worker SetupOverrideComponents(base, replacements, &source, &parsed);
113*6777b538SAndroid Build Coastguard Worker return DoCanonicalizeFileSystemURL(base, source, parsed, charset_converter,
114*6777b538SAndroid Build Coastguard Worker output, new_parsed);
115*6777b538SAndroid Build Coastguard Worker }
116*6777b538SAndroid Build Coastguard Worker
ReplaceFileSystemURL(const char * base,const Parsed & base_parsed,const Replacements<char16_t> & replacements,CharsetConverter * charset_converter,CanonOutput * output,Parsed * new_parsed)117*6777b538SAndroid Build Coastguard Worker bool ReplaceFileSystemURL(const char* base,
118*6777b538SAndroid Build Coastguard Worker const Parsed& base_parsed,
119*6777b538SAndroid Build Coastguard Worker const Replacements<char16_t>& replacements,
120*6777b538SAndroid Build Coastguard Worker CharsetConverter* charset_converter,
121*6777b538SAndroid Build Coastguard Worker CanonOutput* output,
122*6777b538SAndroid Build Coastguard Worker Parsed* new_parsed) {
123*6777b538SAndroid Build Coastguard Worker RawCanonOutput<1024> utf8;
124*6777b538SAndroid Build Coastguard Worker URLComponentSource<char> source(base);
125*6777b538SAndroid Build Coastguard Worker Parsed parsed(base_parsed);
126*6777b538SAndroid Build Coastguard Worker SetupUTF16OverrideComponents(base, replacements, &utf8, &source, &parsed);
127*6777b538SAndroid Build Coastguard Worker return DoCanonicalizeFileSystemURL(base, source, parsed, charset_converter,
128*6777b538SAndroid Build Coastguard Worker output, new_parsed);
129*6777b538SAndroid Build Coastguard Worker }
130*6777b538SAndroid Build Coastguard Worker
131*6777b538SAndroid Build Coastguard Worker } // namespace url
132