diff options
author | phajdan.jr@chromium.org <phajdan.jr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-07-08 18:20:57 +0000 |
---|---|---|
committer | phajdan.jr@chromium.org <phajdan.jr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-07-08 18:20:57 +0000 |
commit | 39de121a7e81a1f399a1e83fee97591383546c88 (patch) | |
tree | ae2a65f14d20181758c459deea9003394c6924a0 /net/ftp/ftp_network_transaction.cc | |
parent | 1f4c7b31ed9395dac76ffd5e1efa95223291492a (diff) | |
download | chromium_src-39de121a7e81a1f399a1e83fee97591383546c88.zip chromium_src-39de121a7e81a1f399a1e83fee97591383546c88.tar.gz chromium_src-39de121a7e81a1f399a1e83fee97591383546c88.tar.bz2 |
FTP: change order of commands to improve compatibility
It turns out some FTP servers react strangely to a RETR for an
unexistent file. They send a success reponse followed by a failure
response.
The solution is to move the file/directory sniffing logic from
RETR earlier, to SIZE.
BUG=44582
TEST=net_unittests
Review URL: http://codereview.chromium.org/2813044
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@51866 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/ftp/ftp_network_transaction.cc')
-rw-r--r-- | net/ftp/ftp_network_transaction.cc | 57 |
1 files changed, 14 insertions, 43 deletions
diff --git a/net/ftp/ftp_network_transaction.cc b/net/ftp/ftp_network_transaction.cc index 70ebde1..123e399 100644 --- a/net/ftp/ftp_network_transaction.cc +++ b/net/ftp/ftp_network_transaction.cc @@ -334,9 +334,6 @@ int FtpNetworkTransaction::ProcessCtrlResponse() { case COMMAND_LIST: rv = ProcessResponseLIST(response); break; - case COMMAND_MDTM: - rv = ProcessResponseMDTM(response); - break; case COMMAND_QUIT: rv = ProcessResponseQUIT(response); break; @@ -552,10 +549,6 @@ int FtpNetworkTransaction::DoLoop(int result) { DCHECK(rv == OK); rv = DoCtrlWriteLIST(); break; - case STATE_CTRL_WRITE_MDTM: - DCHECK(rv == OK); - rv = DoCtrlWriteMDTM(); - break; case STATE_CTRL_WRITE_QUIT: DCHECK(rv == OK); rv = DoCtrlWriteQUIT(); @@ -1005,12 +998,24 @@ int FtpNetworkTransaction::ProcessResponseSIZE( case ERROR_CLASS_TRANSIENT_ERROR: break; case ERROR_CLASS_PERMANENT_ERROR: + // It's possible that SIZE failed because the path is a directory. + if (response.status_code == 550 && + resource_type_ == RESOURCE_TYPE_UNKNOWN) { + resource_type_ = RESOURCE_TYPE_DIRECTORY; + } else if (resource_type_ != RESOURCE_TYPE_DIRECTORY) { + return Stop(ERR_FAILED); + } break; default: NOTREACHED(); return Stop(ERR_UNEXPECTED); } - next_state_ = STATE_CTRL_WRITE_MDTM; + + if (resource_type_ == RESOURCE_TYPE_DIRECTORY) + next_state_ = STATE_CTRL_WRITE_CWD; + else + next_state_ = STATE_CTRL_WRITE_RETR; + return OK; } @@ -1062,36 +1067,6 @@ int FtpNetworkTransaction::ProcessResponseRETR( return OK; } -// MDMT command -int FtpNetworkTransaction::DoCtrlWriteMDTM() { - std::string command = "MDTM " + GetRequestPathForFtpCommand(false); - next_state_ = STATE_CTRL_READ; - return SendFtpCommand(command, COMMAND_MDTM); -} - -int FtpNetworkTransaction::ProcessResponseMDTM( - const FtpCtrlResponse& response) { - switch (GetErrorClass(response.status_code)) { - case ERROR_CLASS_INITIATED: - return Stop(ERR_FAILED); - case ERROR_CLASS_OK: - next_state_ = STATE_CTRL_WRITE_RETR; - break; - case ERROR_CLASS_INFO_NEEDED: - return Stop(ERR_FAILED); - case ERROR_CLASS_TRANSIENT_ERROR: - return Stop(ERR_FAILED); - case ERROR_CLASS_PERMANENT_ERROR: - next_state_ = STATE_CTRL_WRITE_RETR; - break; - default: - NOTREACHED(); - return Stop(ERR_UNEXPECTED); - } - return OK; -} - - // CWD command int FtpNetworkTransaction::DoCtrlWriteCWD() { std::string command = "CWD " + GetRequestPathForFtpCommand(true); @@ -1226,11 +1201,7 @@ int FtpNetworkTransaction::DoDataConnect() { int FtpNetworkTransaction::DoDataConnectComplete(int result) { RecordDataConnectionError(result); - if (resource_type_ == RESOURCE_TYPE_DIRECTORY) { - next_state_ = STATE_CTRL_WRITE_CWD; - } else { - next_state_ = STATE_CTRL_WRITE_SIZE; - } + next_state_ = STATE_CTRL_WRITE_SIZE; return OK; } |