summaryrefslogtreecommitdiffstats
path: root/net/ftp
diff options
context:
space:
mode:
authorphajdan.jr@chromium.org <phajdan.jr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-12 21:11:10 +0000
committerphajdan.jr@chromium.org <phajdan.jr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-12 21:11:10 +0000
commit0ea508612f10bbd8578e4384c26afe4859f7f7ba (patch)
treea6327d211957e367567aa70fb4cc71a08506315a /net/ftp
parentbfd82e21f9ab168e2aa27454e11e97fc87a55a58 (diff)
downloadchromium_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.cc23
-rw-r--r--net/ftp/ftp_directory_listing_parser_unittest.cc31
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",