summaryrefslogtreecommitdiffstats
path: root/net/ftp/ftp_network_transaction.cc
diff options
context:
space:
mode:
Diffstat (limited to 'net/ftp/ftp_network_transaction.cc')
-rw-r--r--net/ftp/ftp_network_transaction.cc30
1 files changed, 27 insertions, 3 deletions
diff --git a/net/ftp/ftp_network_transaction.cc b/net/ftp/ftp_network_transaction.cc
index 5b3ff67..980e0ab 100644
--- a/net/ftp/ftp_network_transaction.cc
+++ b/net/ftp/ftp_network_transaction.cc
@@ -158,7 +158,11 @@ int FtpNetworkTransaction::ParseCtrlResponse(int* cut_pos) {
return ERR_INVALID_RESPONSE;
ctrl_responses_.push(ResponseLine(status_code, status_text));
*cut_pos = i + 1;
+
+ // Prepare to handle the next line.
scan_state = CODE;
+ status_code = 0;
+ status_text = "";
break;
default:
NOTREACHED();
@@ -172,7 +176,6 @@ int FtpNetworkTransaction::ParseCtrlResponse(int* cut_pos) {
// Used to prepare and send FTP commad.
int FtpNetworkTransaction::SendFtpCommand(const std::string& command,
Command cmd) {
- response_message_buf_len_ = 0;
command_sent_ = cmd;
DLOG(INFO) << " >> " << command;
const char* buf = command.c_str();
@@ -199,8 +202,29 @@ int FtpNetworkTransaction::ProcessCtrlResponses() {
return rv;
}
- // TODO(phajdan.jr): Correctly handle multiple code 230 response lines after
- // PASS command.
+ // Eat multiple 230 lines after PASS.
+ if (command_sent_ == COMMAND_PASS) {
+ while (ctrl_responses_.size() > 1) {
+ if (ctrl_responses_.front().code != 230)
+ break;
+ ctrl_responses_.pop();
+ }
+ }
+
+ // Make sure there are no 230's when we want to process SYST response.
+ if (command_sent_ == COMMAND_SYST) {
+ while (!ctrl_responses_.empty()) {
+ if (ctrl_responses_.front().code != 230)
+ break;
+ ctrl_responses_.pop();
+ }
+ if (ctrl_responses_.empty()) {
+ // Read more from control socket.
+ next_state_ = STATE_CTRL_READ;
+ return rv;
+ }
+ }
+
if (ctrl_responses_.size() != 1)
return Stop(ERR_INVALID_RESPONSE);