diff options
author | phajdan.jr@chromium.org <phajdan.jr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-12-12 21:11:10 +0000 |
---|---|---|
committer | phajdan.jr@chromium.org <phajdan.jr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-12-12 21:11:10 +0000 |
commit | 0ea508612f10bbd8578e4384c26afe4859f7f7ba (patch) | |
tree | a6327d211957e367567aa70fb4cc71a08506315a /net/ftp | |
parent | bfd82e21f9ab168e2aa27454e11e97fc87a55a58 (diff) | |
download | chromium_src-0ea508612f10bbd8578e4384c26afe4859f7f7ba.zip chromium_src-0ea508612f10bbd8578e4384c26afe4859f7f7ba.tar.gz chromium_src-0ea508612f10bbd8578e4384c26afe4859f7f7ba.tar.bz2 |
FTP: correctly handle newlines in file names
This converts all .expected test files to CRLF line endings.
BUG=164724
Review URL: https://codereview.chromium.org/11470035
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@172656 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/ftp')
-rw-r--r-- | net/ftp/ftp_directory_listing_parser.cc | 23 | ||||
-rw-r--r-- | net/ftp/ftp_directory_listing_parser_unittest.cc | 31 |
2 files changed, 32 insertions, 22 deletions
diff --git a/net/ftp/ftp_directory_listing_parser.cc b/net/ftp/ftp_directory_listing_parser.cc index d7c7c7d..3cacee0 100644 --- a/net/ftp/ftp_directory_listing_parser.cc +++ b/net/ftp/ftp_directory_listing_parser.cc @@ -11,6 +11,7 @@ #include "base/stl_util.h" #include "base/string_split.h" #include "base/string_util.h" +#include "base/utf_string_conversions.h" #include "net/base/net_errors.h" #include "net/ftp/ftp_directory_listing_parser_ls.h" #include "net/ftp/ftp_directory_listing_parser_netware.h" @@ -41,12 +42,13 @@ int FillInRawName(const std::string& encoding, // Parses |text| as an FTP directory listing. Fills in |entries| // and |server_type| and returns network error code. int ParseListing(const string16& text, + const string16& newline_separator, const std::string& encoding, const base::Time& current_time, std::vector<FtpDirectoryListingEntry>* entries, FtpServerType* server_type) { std::vector<string16> lines; - base::SplitString(text, '\n', &lines); + base::SplitStringUsingSubstr(text, newline_separator, &lines); struct { base::Callback<bool(void)> callback; @@ -93,6 +95,8 @@ int DecodeAndParse(const std::string& text, const base::Time& current_time, std::vector<FtpDirectoryListingEntry>* entries, FtpServerType* server_type) { + const char* kNewlineSeparators[] = { "\n", "\r\n" }; + std::vector<std::string> encodings; if (!base::DetectAllEncodings(text, &encodings)) return ERR_ENCODING_DETECTION_FAILED; @@ -104,13 +108,16 @@ int DecodeAndParse(const std::string& text, encodings[i].c_str(), base::OnStringConversionError::FAIL, &converted_text)) { - int rv = ParseListing(converted_text, - encodings[i], - current_time, - entries, - server_type); - if (rv == OK) - return rv; + for (size_t j = 0; j < arraysize(kNewlineSeparators); j++) { + int rv = ParseListing(converted_text, + ASCIIToUTF16(kNewlineSeparators[j]), + encodings[i], + current_time, + entries, + server_type); + if (rv == OK) + return rv; + } } } diff --git a/net/ftp/ftp_directory_listing_parser_unittest.cc b/net/ftp/ftp_directory_listing_parser_unittest.cc index 02f1392..434cdfa 100644 --- a/net/ftp/ftp_directory_listing_parser_unittest.cc +++ b/net/ftp/ftp_directory_listing_parser_unittest.cc @@ -9,7 +9,7 @@ #include "base/path_service.h" #include "base/stringprintf.h" #include "base/string_number_conversions.h" -#include "base/string_tokenizer.h" +#include "base/string_split.h" #include "base/utf_string_conversions.h" #include "net/base/net_errors.h" #include "net/ftp/ftp_directory_listing_parser.h" @@ -56,26 +56,28 @@ TEST_P(FtpDirectoryListingParserTest, Parse) { &expected_listing)); std::vector<std::string> lines; - StringTokenizer tokenizer(expected_listing, "\r\n"); - while (tokenizer.GetNext()) - lines.push_back(tokenizer.token()); + base::SplitStringUsingSubstr(expected_listing, "\r\n", &lines); - ASSERT_EQ(8 * entries.size(), lines.size()); + // Special case for empty listings. + if (lines.size() == 1 && lines[0].empty()) + lines.clear(); - for (size_t i = 0; i < lines.size() / 8; i++) { - std::string type(lines[8 * i]); - std::string name(lines[8 * i + 1]); + ASSERT_EQ(9 * entries.size(), lines.size()); + + for (size_t i = 0; i < lines.size() / 9; i++) { + std::string type(lines[9 * i]); + std::string name(lines[9 * i + 1]); int64 size; - base::StringToInt64(lines[8 * i + 2], &size); + base::StringToInt64(lines[9 * i + 2], &size); SCOPED_TRACE(base::StringPrintf("Filename: %s", name.c_str())); int year, month, day_of_month, hour, minute; - base::StringToInt(lines[8 * i + 3], &year); - base::StringToInt(lines[8 * i + 4], &month); - base::StringToInt(lines[8 * i + 5], &day_of_month); - base::StringToInt(lines[8 * i + 6], &hour); - base::StringToInt(lines[8 * i + 7], &minute); + base::StringToInt(lines[9 * i + 3], &year); + base::StringToInt(lines[9 * i + 4], &month); + base::StringToInt(lines[9 * i + 5], &day_of_month); + base::StringToInt(lines[9 * i + 6], &hour); + base::StringToInt(lines[9 * i + 7], &minute); const FtpDirectoryListingEntry& entry = entries[i]; @@ -138,6 +140,7 @@ const char* kTestFiles[] = { "dir-listing-ls-28", // Hylafax FTP server "dir-listing-ls-29", "dir-listing-ls-30", + "dir-listing-ls-31", "dir-listing-netware-1", "dir-listing-netware-2", |