OLD | NEW |
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <algorithm> | 5 #include <algorithm> |
6 | 6 |
7 #include "net/base/escape.h" | 7 #include "net/base/escape.h" |
8 | 8 |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/string_util.h" | 10 #include "base/string_util.h" |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
106 }; | 106 }; |
107 | 107 |
108 std::string UnescapeURLImpl(const std::string& escaped_text, | 108 std::string UnescapeURLImpl(const std::string& escaped_text, |
109 UnescapeRule::Type rules) { | 109 UnescapeRule::Type rules) { |
110 // The output of the unescaping is always smaller than the input, so we can | 110 // The output of the unescaping is always smaller than the input, so we can |
111 // reserve the input size to make sure we have enough buffer and don't have | 111 // reserve the input size to make sure we have enough buffer and don't have |
112 // to allocate in the loop below. | 112 // to allocate in the loop below. |
113 std::string result; | 113 std::string result; |
114 result.reserve(escaped_text.length()); | 114 result.reserve(escaped_text.length()); |
115 | 115 |
116 for (size_t i = 0, max = escaped_text.size(), max_digit_index = max - 2; | 116 for (size_t i = 0, max = escaped_text.size(); i < max; ++i) { |
117 i < max; ++i) { | 117 if (escaped_text[i] == '%' && i + 2 < max) { |
118 if (escaped_text[i] == '%' && i < max_digit_index) { | |
119 const std::string::value_type most_sig_digit(escaped_text[i + 1]); | 118 const std::string::value_type most_sig_digit(escaped_text[i + 1]); |
120 const std::string::value_type least_sig_digit(escaped_text[i + 2]); | 119 const std::string::value_type least_sig_digit(escaped_text[i + 2]); |
121 if (IsHex(most_sig_digit) && IsHex(least_sig_digit)) { | 120 if (IsHex(most_sig_digit) && IsHex(least_sig_digit)) { |
122 unsigned char value = HexToInt(most_sig_digit) * 16 + | 121 unsigned char value = HexToInt(most_sig_digit) * 16 + |
123 HexToInt(least_sig_digit); | 122 HexToInt(least_sig_digit); |
124 if (value >= 0x80 || // Unescape all high-bit characters. | 123 if (value >= 0x80 || // Unescape all high-bit characters. |
125 // For 7-bit characters, the lookup table tells us all valid chars. | 124 // For 7-bit characters, the lookup table tells us all valid chars. |
126 (kUrlUnescape[value] || | 125 (kUrlUnescape[value] || |
127 // ...and we allow some additional unescaping when flags are set. | 126 // ...and we allow some additional unescaping when flags are set. |
128 (value == ' ' && (rules & UnescapeRule::SPACES)) || | 127 (value == ' ' && (rules & UnescapeRule::SPACES)) || |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
277 } | 276 } |
278 | 277 |
279 std::string EscapeForHTML(const std::string& input) { | 278 std::string EscapeForHTML(const std::string& input) { |
280 return EscapeForHTMLImpl(input); | 279 return EscapeForHTMLImpl(input); |
281 } | 280 } |
282 | 281 |
283 std::wstring EscapeForHTML(const std::wstring& input) { | 282 std::wstring EscapeForHTML(const std::wstring& input) { |
284 return EscapeForHTMLImpl(input); | 283 return EscapeForHTMLImpl(input); |
285 } | 284 } |
286 | 285 |
OLD | NEW |