This source file includes following definitions.
- DoCanonicalizeFileSystemURL
- CanonicalizeFileSystemURL
- CanonicalizeFileSystemURL
- ReplaceFileSystemURL
- ReplaceFileSystemURL
#include "url/url_canon.h"
#include "url/url_canon_internal.h"
#include "url/url_file.h"
#include "url/url_parse_internal.h"
#include "url/url_util.h"
#include "url/url_util_internal.h"
namespace url_canon {
namespace {
template<typename CHAR, typename UCHAR>
bool DoCanonicalizeFileSystemURL(const CHAR* spec,
const URLComponentSource<CHAR>& source,
const url_parse::Parsed& parsed,
CharsetConverter* charset_converter,
CanonOutput* output,
url_parse::Parsed* new_parsed) {
new_parsed->username = url_parse::Component();
new_parsed->password = url_parse::Component();
new_parsed->host = url_parse::Component();
new_parsed->port = url_parse::Component();
const url_parse::Parsed* inner_parsed = parsed.inner_parsed();
url_parse::Parsed new_inner_parsed;
new_parsed->scheme.begin = output->length();
output->Append("filesystem:", 11);
new_parsed->scheme.len = 10;
if (!parsed.inner_parsed() || !parsed.inner_parsed()->scheme.is_valid())
return false;
bool success = true;
if (url_util::CompareSchemeComponent(spec, inner_parsed->scheme,
url_util::kFileScheme)) {
new_inner_parsed.scheme.begin = output->length();
output->Append("file://", 7);
new_inner_parsed.scheme.len = 4;
success &= CanonicalizePath(spec, inner_parsed->path, output,
&new_inner_parsed.path);
} else if (url_util::IsStandard(spec, inner_parsed->scheme)) {
success =
url_canon::CanonicalizeStandardURL(spec,
parsed.inner_parsed()->Length(),
*parsed.inner_parsed(),
charset_converter, output,
&new_inner_parsed);
} else {
return false;
}
success &= parsed.inner_parsed()->path.len > 1;
success &= CanonicalizePath(source.path, parsed.path, output,
&new_parsed->path);
CanonicalizeQuery(source.query, parsed.query, charset_converter,
output, &new_parsed->query);
CanonicalizeRef(source.ref, parsed.ref, output, &new_parsed->ref);
if (success)
new_parsed->set_inner_parsed(new_inner_parsed);
return success;
}
}
bool CanonicalizeFileSystemURL(const char* spec,
int spec_len,
const url_parse::Parsed& parsed,
CharsetConverter* charset_converter,
CanonOutput* output,
url_parse::Parsed* new_parsed) {
return DoCanonicalizeFileSystemURL<char, unsigned char>(
spec, URLComponentSource<char>(spec), parsed, charset_converter, output,
new_parsed);
}
bool CanonicalizeFileSystemURL(const base::char16* spec,
int spec_len,
const url_parse::Parsed& parsed,
CharsetConverter* charset_converter,
CanonOutput* output,
url_parse::Parsed* new_parsed) {
return DoCanonicalizeFileSystemURL<base::char16, base::char16>(
spec, URLComponentSource<base::char16>(spec), parsed, charset_converter,
output, new_parsed);
}
bool ReplaceFileSystemURL(const char* base,
const url_parse::Parsed& base_parsed,
const Replacements<char>& replacements,
CharsetConverter* charset_converter,
CanonOutput* output,
url_parse::Parsed* new_parsed) {
URLComponentSource<char> source(base);
url_parse::Parsed parsed(base_parsed);
SetupOverrideComponents(base, replacements, &source, &parsed);
return DoCanonicalizeFileSystemURL<char, unsigned char>(
base, source, parsed, charset_converter, output, new_parsed);
}
bool ReplaceFileSystemURL(const char* base,
const url_parse::Parsed& base_parsed,
const Replacements<base::char16>& replacements,
CharsetConverter* charset_converter,
CanonOutput* output,
url_parse::Parsed* new_parsed) {
RawCanonOutput<1024> utf8;
URLComponentSource<char> source(base);
url_parse::Parsed parsed(base_parsed);
SetupUTF16OverrideComponents(base, replacements, &utf8, &source, &parsed);
return DoCanonicalizeFileSystemURL<char, unsigned char>(
base, source, parsed, charset_converter, output, new_parsed);
}
}