Index: net/ftp/ftp_network_transaction.cc |
diff --git a/net/ftp/ftp_network_transaction.cc b/net/ftp/ftp_network_transaction.cc |
index ef896b8f312e41342eb8cd8657bd4ce945f9a431..0ff4eea7c839290bbb23852f988628ea25d57f7e 100644 |
--- a/net/ftp/ftp_network_transaction.cc |
+++ b/net/ftp/ftp_network_transaction.cc |
@@ -36,11 +36,11 @@ FtpNetworkTransaction::FtpNetworkTransaction( |
request_(NULL), |
resolver_(session->host_resolver()), |
read_ctrl_buf_(new IOBuffer(kCtrlBufLen)), |
+ ctrl_response_buffer_(new FtpCtrlResponseBuffer()), |
read_data_buf_len_(0), |
file_data_len_(0), |
write_command_buf_written_(0), |
last_error_(OK), |
- is_anonymous_(false), |
retr_failed_(false), |
data_connection_port_(0), |
socket_factory_(socket_factory), |
@@ -56,6 +56,17 @@ int FtpNetworkTransaction::Start(const FtpRequestInfo* request_info, |
load_log_ = load_log; |
request_ = request_info; |
+ if (request_->url.has_username()) { |
+ username_ = UTF8ToWide(request_->url.username()); |
wtc
2009/08/25 20:52:50
Please ask Darin and Brett whether the embedded us
eroman
2009/09/01 07:12:37
They definitely do need to be unescaped.
See Http
|
+ if (request_->url.has_password()) |
eroman
2009/09/01 07:12:37
Don't actually need the guard, will just be empty
|
+ password_ = UTF8ToWide(request_->url.password()); |
+ else |
wtc
2009/08/25 20:52:50
Do we need the "else" here? password_ is initiali
|
+ password_ = L""; |
+ } else { |
+ username_ = L"anonymous"; |
+ password_ = L"chrome@example.com"; |
+ } |
+ |
next_state_ = STATE_CTRL_INIT; |
int rv = DoLoop(OK); |
if (rv == ERR_IO_PENDING) |
@@ -75,7 +86,16 @@ int FtpNetworkTransaction::Stop(int error) { |
int FtpNetworkTransaction::RestartWithAuth(const std::wstring& username, |
const std::wstring& password, |
CompletionCallback* callback) { |
- return ERR_FAILED; |
+ ResetStateForRestart(); |
+ |
+ username_ = username; |
+ password_ = password; |
+ |
+ next_state_ = STATE_CTRL_INIT; |
+ int rv = DoLoop(OK); |
+ if (rv == ERR_IO_PENDING) |
+ user_callback_ = callback; |
+ return rv; |
} |
int FtpNetworkTransaction::RestartIgnoringLastError( |
@@ -134,7 +154,7 @@ int FtpNetworkTransaction::SendFtpCommand(const std::string& command, |
// If we send a new command when we still have unprocessed responses |
// for previous commands, the response receiving code will have no way to know |
// which responses are for which command. |
- DCHECK(!ctrl_response_buffer_.ResponseAvailable()); |
+ DCHECK(!ctrl_response_buffer_->ResponseAvailable()); |
DCHECK(!write_command_buf_); |
DCHECK(!write_buf_); |
@@ -176,7 +196,7 @@ FtpNetworkTransaction::ErrorClass FtpNetworkTransaction::GetErrorClass( |
} |
int FtpNetworkTransaction::ProcessCtrlResponse() { |
- FtpCtrlResponse response = ctrl_response_buffer_.PopResponse(); |
+ FtpCtrlResponse response = ctrl_response_buffer_->PopResponse(); |
int rv = OK; |
switch (command_sent_) { |
@@ -230,8 +250,8 @@ int FtpNetworkTransaction::ProcessCtrlResponse() { |
// We may get multiple responses for some commands, |
// see http://crbug.com/18036. |
- while (ctrl_response_buffer_.ResponseAvailable() && rv == OK) { |
- response = ctrl_response_buffer_.PopResponse(); |
+ while (ctrl_response_buffer_->ResponseAvailable() && rv == OK) { |
+ response = ctrl_response_buffer_->PopResponse(); |
switch (command_sent_) { |
case COMMAND_RETR: |
@@ -246,6 +266,24 @@ int FtpNetworkTransaction::ProcessCtrlResponse() { |
return rv; |
} |
+void FtpNetworkTransaction::ResetStateForRestart() { |
+ command_sent_ = COMMAND_NONE; |
+ user_callback_ = NULL; |
+ response_ = FtpResponseInfo(); |
+ read_ctrl_buf_ = new IOBuffer(kCtrlBufLen); |
+ ctrl_response_buffer_.reset(new FtpCtrlResponseBuffer()); |
+ read_data_buf_ = NULL; |
+ read_data_buf_len_ = 0; |
+ file_data_len_ = 0; |
+ write_command_buf_written_ = 0; |
+ last_error_ = OK; |
+ retr_failed_ = false; |
+ data_connection_port_ = 0; |
+ ctrl_socket_.reset(); |
+ data_socket_.reset(); |
+ next_state_ = STATE_NONE; |
+} |
+ |
void FtpNetworkTransaction::DoCallback(int rv) { |
DCHECK(rv != ERR_IO_PENDING); |
DCHECK(user_callback_); |
@@ -443,9 +481,9 @@ int FtpNetworkTransaction::DoCtrlReadComplete(int result) { |
if (result < 0) |
return Stop(result); |
- ctrl_response_buffer_.ConsumeData(read_ctrl_buf_->data(), result); |
+ ctrl_response_buffer_->ConsumeData(read_ctrl_buf_->data(), result); |
- if (!ctrl_response_buffer_.ResponseAvailable()) { |
+ if (!ctrl_response_buffer_->ResponseAvailable()) { |
// Read more data from the control socket. |
next_state_ = STATE_CTRL_READ; |
return OK; |
@@ -486,14 +524,7 @@ int FtpNetworkTransaction::DoCtrlWriteComplete(int result) { |
// USER Command. |
int FtpNetworkTransaction::DoCtrlWriteUSER() { |
- std::string command = "USER"; |
- if (request_->url.has_username()) { |
- command.append(" "); |
- command.append(request_->url.username()); |
- } else { |
- is_anonymous_ = true; |
- command.append(" anonymous"); |
- } |
+ std::string command = "USER " + WideToUTF8(username_); |
wtc
2009/08/25 20:52:50
Can you add a comment to the header to explain why
|
next_state_ = STATE_CTRL_READ; |
return SendFtpCommand(command, COMMAND_USER); |
} |
@@ -522,14 +553,7 @@ int FtpNetworkTransaction::ProcessResponseUSER( |
// PASS command. |
int FtpNetworkTransaction::DoCtrlWritePASS() { |
- std::string command = "PASS"; |
- if (request_->url.has_password()) { |
- command.append(" "); |
- command.append(request_->url.password()); |
- } else { |
- command.append(" "); |
- command.append("chrome@example.com"); |
- } |
+ std::string command = "PASS " + WideToUTF8(password_); |
eroman
2009/09/01 07:12:37
PLEASE READ: This looks dangerous!
|username_| an
|
next_state_ = STATE_CTRL_READ; |
return SendFtpCommand(command, COMMAND_PASS); |
} |
@@ -552,7 +576,7 @@ int FtpNetworkTransaction::ProcessResponsePASS( |
if (response.status_code == 503) { |
next_state_ = STATE_CTRL_WRITE_USER; |
} else { |
- // TODO(ibrar): Retry here. |
+ response_.auth_needed = true; |
eroman
2009/09/01 07:12:37
Hm, I dont know about this... will have to look mo
|
return Stop(ERR_FAILED); |
} |
break; |