| Index: url/url_util.cc
|
| diff --git a/url/url_util.cc b/url/url_util.cc
|
| index 0a84d5e23cbed5d4254d8cf17c837ef937fefc53..0b3044dc854487cf56e99462d033c0bd671275ed 100644
|
| --- a/url/url_util.cc
|
| +++ b/url/url_util.cc
|
| @@ -19,6 +19,13 @@ namespace url {
|
|
|
| namespace {
|
|
|
| +// Pass this enum through for methods which would like to know if whitespace
|
| +// removal is necessary.
|
| +enum WhitespaceRemovalPolicy {
|
| + REMOVE_WHITESPACE,
|
| + DO_NOT_REMOVE_WHITESPACE,
|
| +};
|
| +
|
| const int kNumStandardURLSchemes = 10;
|
| const SchemeWithType kStandardURLSchemes[kNumStandardURLSchemes] = {
|
| {kHttpScheme, SCHEME_WITH_PORT},
|
| @@ -154,19 +161,19 @@ bool DoFindAndCompareScheme(const CHAR* str,
|
| return DoCompareSchemeComponent(spec, our_scheme, compare);
|
| }
|
|
|
| -template<typename CHAR>
|
| -bool DoCanonicalize(const CHAR* in_spec,
|
| - int in_spec_len,
|
| +template <typename CHAR>
|
| +bool DoCanonicalize(const CHAR* spec,
|
| + int spec_len,
|
| bool trim_path_end,
|
| + WhitespaceRemovalPolicy whitespace_policy,
|
| CharsetConverter* charset_converter,
|
| CanonOutput* output,
|
| Parsed* output_parsed) {
|
| - // Remove any whitespace from the middle of the relative URL, possibly
|
| - // copying to the new buffer.
|
| + // Remove any whitespace from the middle of the relative URL if necessary.
|
| + // Possibly this will result in copying to the new buffer.
|
| RawCanonOutputT<CHAR> whitespace_buffer;
|
| - int spec_len;
|
| - const CHAR* spec = RemoveURLWhitespace(in_spec, in_spec_len,
|
| - &whitespace_buffer, &spec_len);
|
| + if (whitespace_policy == REMOVE_WHITESPACE)
|
| + spec = RemoveURLWhitespace(spec, spec_len, &whitespace_buffer, &spec_len);
|
|
|
| Parsed parsed_input;
|
| #ifdef WIN32
|
| @@ -287,7 +294,8 @@ bool DoResolveRelative(const char* base_spec,
|
| // based on base_parsed_authority instead of base_parsed) and needs to be
|
| // re-created.
|
| DoCanonicalize(temporary_output.data(), temporary_output.length(), true,
|
| - charset_converter, output, output_parsed);
|
| + REMOVE_WHITESPACE, charset_converter, output,
|
| + output_parsed);
|
| return did_resolve_succeed;
|
| }
|
| } else if (is_relative) {
|
| @@ -300,8 +308,9 @@ bool DoResolveRelative(const char* base_spec,
|
| }
|
|
|
| // Not relative, canonicalize the input.
|
| - return DoCanonicalize(relative, relative_length, true, charset_converter,
|
| - output, output_parsed);
|
| + return DoCanonicalize(relative, relative_length, true,
|
| + DO_NOT_REMOVE_WHITESPACE, charset_converter, output,
|
| + output_parsed);
|
| }
|
|
|
| template<typename CHAR>
|
| @@ -348,8 +357,8 @@ bool DoReplaceComponents(const char* spec,
|
| RawCanonOutput<128> recanonicalized;
|
| Parsed recanonicalized_parsed;
|
| DoCanonicalize(scheme_replaced.data(), scheme_replaced.length(), true,
|
| - charset_converter,
|
| - &recanonicalized, &recanonicalized_parsed);
|
| + REMOVE_WHITESPACE, charset_converter, &recanonicalized,
|
| + &recanonicalized_parsed);
|
|
|
| // Recurse using the version with the scheme already replaced. This will now
|
| // use the replacement rules for the new scheme.
|
| @@ -535,8 +544,8 @@ bool Canonicalize(const char* spec,
|
| CharsetConverter* charset_converter,
|
| CanonOutput* output,
|
| Parsed* output_parsed) {
|
| - return DoCanonicalize(spec, spec_len, trim_path_end, charset_converter,
|
| - output, output_parsed);
|
| + return DoCanonicalize(spec, spec_len, trim_path_end, REMOVE_WHITESPACE,
|
| + charset_converter, output, output_parsed);
|
| }
|
|
|
| bool Canonicalize(const base::char16* spec,
|
| @@ -545,8 +554,8 @@ bool Canonicalize(const base::char16* spec,
|
| CharsetConverter* charset_converter,
|
| CanonOutput* output,
|
| Parsed* output_parsed) {
|
| - return DoCanonicalize(spec, spec_len, trim_path_end, charset_converter,
|
| - output, output_parsed);
|
| + return DoCanonicalize(spec, spec_len, trim_path_end, REMOVE_WHITESPACE,
|
| + charset_converter, output, output_parsed);
|
| }
|
|
|
| bool ResolveRelative(const char* base_spec,
|
|
|