summaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorphajdan.jr@chromium.org <phajdan.jr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-11-07 09:30:20 +0000
committerphajdan.jr@chromium.org <phajdan.jr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-11-07 09:30:20 +0000
commit6373cf4d71577e2e690fed377959d79056908291 (patch)
treebe34056807c1394603dec332e13f08e3f008be81 /net
parent5e6c1e4a641a9668c70e713f3e559ebde15c775c (diff)
downloadchromium_src-6373cf4d71577e2e690fed377959d79056908291.zip
chromium_src-6373cf4d71577e2e690fed377959d79056908291.tar.gz
chromium_src-6373cf4d71577e2e690fed377959d79056908291.tar.bz2
Use the new FTP LIST parsing code in the browser.
Fall back to the old parsing code on errors. TEST=none BUG=25520 Review URL: http://codereview.chromium.org/343073 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@31379 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net')
-rw-r--r--net/ftp/ftp_directory_listing_buffer.cc7
-rw-r--r--net/ftp/ftp_directory_listing_buffer.h17
-rw-r--r--net/ftp/ftp_directory_listing_parsers.h5
3 files changed, 23 insertions, 6 deletions
diff --git a/net/ftp/ftp_directory_listing_buffer.cc b/net/ftp/ftp_directory_listing_buffer.cc
index 8e3ee39..e41cb9e 100644
--- a/net/ftp/ftp_directory_listing_buffer.cc
+++ b/net/ftp/ftp_directory_listing_buffer.cc
@@ -67,6 +67,9 @@ int FtpDirectoryListingBuffer::ProcessRemainingData() {
if (rv != OK)
return rv;
+ if (!buffer_.empty())
+ return ERR_INVALID_RESPONSE;
+
return ParseLines();
}
@@ -79,6 +82,10 @@ FtpDirectoryListingEntry FtpDirectoryListingBuffer::PopEntry() {
return current_parser_->PopEntry();
}
+FtpServerType FtpDirectoryListingBuffer::GetServerType() const {
+ return (current_parser_ ? current_parser_->GetServerType() : SERVER_UNKNOWN);
+}
+
bool FtpDirectoryListingBuffer::ConvertToDetectedEncoding(
const std::string& from, string16* to) {
std::string encoding(encoding_.empty() ? "ascii" : encoding_);
diff --git a/net/ftp/ftp_directory_listing_buffer.h b/net/ftp/ftp_directory_listing_buffer.h
index eaa237e..9489135 100644
--- a/net/ftp/ftp_directory_listing_buffer.h
+++ b/net/ftp/ftp_directory_listing_buffer.h
@@ -12,16 +12,17 @@
#include "base/basictypes.h"
#include "base/string16.h"
#include "base/time.h"
+#include "net/ftp/ftp_server_type_histograms.h"
namespace net {
-
+
struct FtpDirectoryListingEntry;
class FtpDirectoryListingParser;
-
+
class FtpDirectoryListingBuffer {
public:
FtpDirectoryListingBuffer();
-
+
~FtpDirectoryListingBuffer();
// Called when data is received from the data socket. Returns network
@@ -38,9 +39,13 @@ class FtpDirectoryListingBuffer {
// unless EntryAvailable returns true.
FtpDirectoryListingEntry PopEntry();
+ // Returns recognized server type. It is valid to call this function at any
+ // time, although it will return SERVER_UNKNOWN if it doesn't know the answer.
+ FtpServerType GetServerType() const;
+
private:
typedef std::set<FtpDirectoryListingParser*> ParserSet;
-
+
// Converts the string |from| to detected encoding and stores it in |to|.
// Returns true on success.
bool ConvertToDetectedEncoding(const std::string& from, string16* to);
@@ -60,11 +65,11 @@ class FtpDirectoryListingBuffer {
// CRLF-delimited lines, without the CRLF, not yet consumed by parser.
std::deque<string16> lines_;
-
+
// A collection of parsers for different listing styles. The parsers are owned
// by this FtpDirectoryListingBuffer.
ParserSet parsers_;
-
+
// When we're sure about the listing format, its parser is stored in
// |current_parser_|.
FtpDirectoryListingParser* current_parser_;
diff --git a/net/ftp/ftp_directory_listing_parsers.h b/net/ftp/ftp_directory_listing_parsers.h
index 62a23cf..6906861 100644
--- a/net/ftp/ftp_directory_listing_parsers.h
+++ b/net/ftp/ftp_directory_listing_parsers.h
@@ -33,6 +33,8 @@ class FtpDirectoryListingParser {
public:
virtual ~FtpDirectoryListingParser();
+ virtual FtpServerType GetServerType() const = 0;
+
// Adds |line| to the internal parsing buffer. Returns true on success.
virtual bool ConsumeLine(const string16& line) = 0;
@@ -50,6 +52,7 @@ class FtpLsDirectoryListingParser : public FtpDirectoryListingParser {
FtpLsDirectoryListingParser();
// FtpDirectoryListingParser methods:
+ virtual FtpServerType GetServerType() const { return SERVER_LSL; }
virtual bool ConsumeLine(const string16& line);
virtual bool EntryAvailable() const;
virtual FtpDirectoryListingEntry PopEntry();
@@ -67,6 +70,7 @@ class FtpWindowsDirectoryListingParser : public FtpDirectoryListingParser {
FtpWindowsDirectoryListingParser();
// FtpDirectoryListingParser methods:
+ virtual FtpServerType GetServerType() const { return SERVER_DOS; }
virtual bool ConsumeLine(const string16& line);
virtual bool EntryAvailable() const;
virtual FtpDirectoryListingEntry PopEntry();
@@ -83,6 +87,7 @@ class FtpVmsDirectoryListingParser : public FtpDirectoryListingParser {
FtpVmsDirectoryListingParser();
// FtpDirectoryListingParser methods:
+ virtual FtpServerType GetServerType() const { return SERVER_VMS; }
virtual bool ConsumeLine(const string16& line);
virtual bool EntryAvailable() const;
virtual FtpDirectoryListingEntry PopEntry();