| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "net/http/http_content_disposition.h" | 5 #include "net/http/http_content_disposition.h" |
| 6 | 6 |
| 7 #include "base/base64.h" | 7 #include "base/base64.h" |
| 8 #include "base/logging.h" | 8 #include "base/logging.h" |
| 9 #include "base/strings/string_tokenizer.h" | 9 #include "base/strings/string_tokenizer.h" |
| 10 #include "base/strings/string_util.h" | 10 #include "base/strings/string_util.h" |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 79 bool DecodeWord(const std::string& encoded_word, | 79 bool DecodeWord(const std::string& encoded_word, |
| 80 const std::string& referrer_charset, | 80 const std::string& referrer_charset, |
| 81 bool* is_rfc2047, | 81 bool* is_rfc2047, |
| 82 std::string* output, | 82 std::string* output, |
| 83 int* parse_result_flags) { | 83 int* parse_result_flags) { |
| 84 *is_rfc2047 = false; | 84 *is_rfc2047 = false; |
| 85 output->clear(); | 85 output->clear(); |
| 86 if (encoded_word.empty()) | 86 if (encoded_word.empty()) |
| 87 return true; | 87 return true; |
| 88 | 88 |
| 89 if (!IsStringASCII(encoded_word)) { | 89 if (!base::IsStringASCII(encoded_word)) { |
| 90 // Try UTF-8, referrer_charset and the native OS default charset in turn. | 90 // Try UTF-8, referrer_charset and the native OS default charset in turn. |
| 91 if (IsStringUTF8(encoded_word)) { | 91 if (base::IsStringUTF8(encoded_word)) { |
| 92 *output = encoded_word; | 92 *output = encoded_word; |
| 93 } else { | 93 } else { |
| 94 base::string16 utf16_output; | 94 base::string16 utf16_output; |
| 95 if (!referrer_charset.empty() && | 95 if (!referrer_charset.empty() && |
| 96 net::ConvertToUTF16(encoded_word, referrer_charset.c_str(), | 96 net::ConvertToUTF16(encoded_word, referrer_charset.c_str(), |
| 97 &utf16_output)) { | 97 &utf16_output)) { |
| 98 *output = base::UTF16ToUTF8(utf16_output); | 98 *output = base::UTF16ToUTF8(utf16_output); |
| 99 } else { | 99 } else { |
| 100 *output = base::WideToUTF8(base::SysNativeMBToWide(encoded_word)); | 100 *output = base::WideToUTF8(base::SysNativeMBToWide(encoded_word)); |
| 101 } | 101 } |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 184 // We're not handling 'especial' characters quoted with '\', but | 184 // We're not handling 'especial' characters quoted with '\', but |
| 185 // it should be Ok because we're not an email client but a | 185 // it should be Ok because we're not an email client but a |
| 186 // web browser. | 186 // web browser. |
| 187 | 187 |
| 188 // What IE6/7 does: %-escaped UTF-8. | 188 // What IE6/7 does: %-escaped UTF-8. |
| 189 decoded_word = net::UnescapeURLComponent(encoded_word, | 189 decoded_word = net::UnescapeURLComponent(encoded_word, |
| 190 net::UnescapeRule::SPACES); | 190 net::UnescapeRule::SPACES); |
| 191 if (decoded_word != encoded_word) | 191 if (decoded_word != encoded_word) |
| 192 *parse_result_flags |= | 192 *parse_result_flags |= |
| 193 net::HttpContentDisposition::HAS_PERCENT_ENCODED_STRINGS; | 193 net::HttpContentDisposition::HAS_PERCENT_ENCODED_STRINGS; |
| 194 if (IsStringUTF8(decoded_word)) { | 194 if (base::IsStringUTF8(decoded_word)) { |
| 195 output->swap(decoded_word); | 195 output->swap(decoded_word); |
| 196 return true; | 196 return true; |
| 197 // We can try either the OS default charset or 'origin charset' here, | 197 // We can try either the OS default charset or 'origin charset' here, |
| 198 // As far as I can tell, IE does not support it. However, I've seen | 198 // As far as I can tell, IE does not support it. However, I've seen |
| 199 // web servers emit %-escaped string in a legacy encoding (usually | 199 // web servers emit %-escaped string in a legacy encoding (usually |
| 200 // origin charset). | 200 // origin charset). |
| 201 // TODO(jungshik) : Test IE further and consider adding a fallback here. | 201 // TODO(jungshik) : Test IE further and consider adding a fallback here. |
| 202 } | 202 } |
| 203 return false; | 203 return false; |
| 204 } | 204 } |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 310 bool DecodeExtValue(const std::string& param_value, std::string* decoded) { | 310 bool DecodeExtValue(const std::string& param_value, std::string* decoded) { |
| 311 if (param_value.find('"') != std::string::npos) | 311 if (param_value.find('"') != std::string::npos) |
| 312 return false; | 312 return false; |
| 313 | 313 |
| 314 std::string charset; | 314 std::string charset; |
| 315 std::string value; | 315 std::string value; |
| 316 if (!ParseExtValueComponents(param_value, &charset, &value)) | 316 if (!ParseExtValueComponents(param_value, &charset, &value)) |
| 317 return false; | 317 return false; |
| 318 | 318 |
| 319 // RFC 5987 value should be ASCII-only. | 319 // RFC 5987 value should be ASCII-only. |
| 320 if (!IsStringASCII(value)) { | 320 if (!base::IsStringASCII(value)) { |
| 321 decoded->clear(); | 321 decoded->clear(); |
| 322 return true; | 322 return true; |
| 323 } | 323 } |
| 324 | 324 |
| 325 std::string unescaped = net::UnescapeURLComponent( | 325 std::string unescaped = net::UnescapeURLComponent( |
| 326 value, net::UnescapeRule::SPACES | net::UnescapeRule::URL_SPECIAL_CHARS); | 326 value, net::UnescapeRule::SPACES | net::UnescapeRule::URL_SPECIAL_CHARS); |
| 327 | 327 |
| 328 return net::ConvertToUtf8AndNormalize(unescaped, charset.c_str(), decoded); | 328 return net::ConvertToUtf8AndNormalize(unescaped, charset.c_str(), decoded); |
| 329 } | 329 } |
| 330 | 330 |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 429 | 429 |
| 430 if (!ext_filename.empty()) | 430 if (!ext_filename.empty()) |
| 431 filename_ = ext_filename; | 431 filename_ = ext_filename; |
| 432 else if (!filename.empty()) | 432 else if (!filename.empty()) |
| 433 filename_ = filename; | 433 filename_ = filename; |
| 434 else | 434 else |
| 435 filename_ = name; | 435 filename_ = name; |
| 436 } | 436 } |
| 437 | 437 |
| 438 } // namespace net | 438 } // namespace net |
| OLD | NEW |