summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--net/ftp/ftp_network_transaction.cc20
-rw-r--r--net/url_request/url_request_new_ftp_job.cc3
2 files changed, 9 insertions, 14 deletions
diff --git a/net/ftp/ftp_network_transaction.cc b/net/ftp/ftp_network_transaction.cc
index ff80fde..95025e7 100644
--- a/net/ftp/ftp_network_transaction.cc
+++ b/net/ftp/ftp_network_transaction.cc
@@ -83,24 +83,15 @@ int FtpNetworkTransaction::Read(IOBuffer* buf,
int buf_len,
CompletionCallback* callback) {
DCHECK(buf);
- DCHECK(buf_len > 0);
-
- if (data_socket_ == NULL)
- return 0; // Data socket closed, no more data left.
-
- if (!data_socket_->IsConnected())
- return 0; // Data socket disconnected, no more data left.
+ DCHECK_GT(buf_len, 0);
read_data_buf_ = buf;
read_data_buf_len_ = buf_len;
next_state_ = STATE_DATA_READ;
-
int rv = DoLoop(OK);
if (rv == ERR_IO_PENDING)
user_callback_ = callback;
- else if (rv == 0)
- data_socket_->Disconnect();
return rv;
}
@@ -836,7 +827,7 @@ int FtpNetworkTransaction::ProcessResponseLIST(
const FtpCtrlResponse& response) {
switch (GetErrorClass(response.status_code)) {
case ERROR_CLASS_INITIATED:
- next_state_ = STATE_CTRL_READ;
+ response_.is_directory_listing = true;
break;
case ERROR_CLASS_OK:
response_.is_directory_listing = true;
@@ -907,7 +898,12 @@ int FtpNetworkTransaction::DoDataConnectComplete(int result) {
int FtpNetworkTransaction::DoDataRead() {
DCHECK(read_data_buf_);
- DCHECK(read_data_buf_len_ > 0);
+ DCHECK_GT(read_data_buf_len_, 0);
+
+ if (data_socket_ == NULL || !data_socket_->IsConnected()) {
+ // No more data so send QUIT Command now and wait for response.
+ return Stop(OK);
+ }
next_state_ = STATE_DATA_READ_COMPLETE;
read_data_buf_->data()[0] = 0;
diff --git a/net/url_request/url_request_new_ftp_job.cc b/net/url_request/url_request_new_ftp_job.cc
index 13d6d9e..fd34945 100644
--- a/net/url_request/url_request_new_ftp_job.cc
+++ b/net/url_request/url_request_new_ftp_job.cc
@@ -180,7 +180,6 @@ int URLRequestNewFtpJob::ProcessFtpDir(net::IOBuffer *buf,
int bytes_read) {
std::string file_entry;
std::string line;
- buf->data()[bytes_read] = 0;
// If all we've seen so far is ASCII, encoding_ is empty. Try to detect the
// encoding. We don't do the separate UTF-8 check here because the encoding
@@ -196,7 +195,7 @@ int URLRequestNewFtpJob::ProcessFtpDir(net::IOBuffer *buf,
encoding_ = DetectEncoding(buf->data(), bytes_read);
int64 file_size;
- std::istringstream iss(buf->data());
+ std::istringstream iss(std::string(buf->data(), bytes_read));
while (getline(iss, line)) {
struct net::ListState state;
struct net::ListResult result;