| Index: url/url_canon_pathurl.cc
|
| diff --git a/url/url_canon_pathurl.cc b/url/url_canon_pathurl.cc
|
| index bc681f4d144f27fa982c4d57523fbe53806364cb..a464f30e5f49535f1730beed36bb27bf6a957bf0 100644
|
| --- a/url/url_canon_pathurl.cc
|
| +++ b/url/url_canon_pathurl.cc
|
| @@ -14,6 +14,36 @@ namespace url_canon {
|
| namespace {
|
|
|
| template<typename CHAR, typename UCHAR>
|
| +bool DoCanonicalizePathComponent(const CHAR* source,
|
| + const url_parse::Component& component,
|
| + CHAR seperator,
|
| + CanonOutput* output,
|
| + url_parse::Component* new_parsed) {
|
| + bool success = true;
|
| + if (component.is_valid()) {
|
| + if (seperator)
|
| + output->push_back(seperator);
|
| + // Copy the path using path URL's more lax escaping rules (think for
|
| + // javascript:). We convert to UTF-8 and escape non-ASCII, but leave all
|
| + // ASCII characters alone. This helps readability of JavaStript.
|
| + new_parsed->begin = output->length();
|
| + int end = component.end();
|
| + for (int i = component.begin; i < end; i++) {
|
| + UCHAR uch = static_cast<UCHAR>(source[i]);
|
| + if (uch < 0x20 || uch >= 0x80)
|
| + success &= AppendUTF8EscapedChar(source, &i, end, output);
|
| + else
|
| + output->push_back(static_cast<char>(uch));
|
| + }
|
| + new_parsed->len = output->length() - new_parsed->begin;
|
| + } else {
|
| + // Empty part.
|
| + new_parsed->reset();
|
| + }
|
| + return success;
|
| +}
|
| +
|
| +template<typename CHAR, typename UCHAR>
|
| bool DoCanonicalizePathURL(const URLComponentSource<CHAR>& source,
|
| const url_parse::Parsed& parsed,
|
| CanonOutput* output,
|
| @@ -28,29 +58,12 @@ bool DoCanonicalizePathURL(const URLComponentSource<CHAR>& source,
|
| new_parsed->password.reset();
|
| new_parsed->host.reset();
|
| new_parsed->port.reset();
|
| -
|
| - if (parsed.path.is_valid()) {
|
| - // Copy the path using path URL's more lax escaping rules (think for
|
| - // javascript:). We convert to UTF-8 and escape non-ASCII, but leave all
|
| - // ASCII characters alone. This helps readability of JavaStript.
|
| - new_parsed->path.begin = output->length();
|
| - int end = parsed.path.end();
|
| - for (int i = parsed.path.begin; i < end; i++) {
|
| - UCHAR uch = static_cast<UCHAR>(source.path[i]);
|
| - if (uch < 0x20 || uch >= 0x80)
|
| - success &= AppendUTF8EscapedChar(source.path, &i, end, output);
|
| - else
|
| - output->push_back(static_cast<char>(uch));
|
| - }
|
| - new_parsed->path.len = output->length() - new_parsed->path.begin;
|
| - } else {
|
| - // Empty path.
|
| - new_parsed->path.reset();
|
| - }
|
| -
|
| - // Assume there's no query or ref.
|
| - new_parsed->query.reset();
|
| - new_parsed->ref.reset();
|
| + success &= DoCanonicalizePathComponent<CHAR, UCHAR>(
|
| + source.path, parsed.path, 0, output, &new_parsed->path);
|
| + success &= DoCanonicalizePathComponent<CHAR, UCHAR>(
|
| + source.query, parsed.query, '?', output, &new_parsed->query);
|
| + success &= DoCanonicalizePathComponent<CHAR, UCHAR>(
|
| + source.ref, parsed.ref, '#', output, &new_parsed->ref);
|
|
|
| return success;
|
| }
|
|
|