Index: net/ftp/ftp_network_transaction.cc |
diff --git a/net/ftp/ftp_network_transaction.cc b/net/ftp/ftp_network_transaction.cc |
index 70ebde174138922250f0f45911b4b77e399796f3..123e399dfde552d32d1f0c4e190e45593bacaf85 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); |
wtc
2010/07/07 23:52:46
Nit: Can we return a better error code than ERR_FA
|
+ } |
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; |
} |