| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/ftp/ftp_network_transaction.h" | 5 #include "net/ftp/ftp_network_transaction.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
| 9 #include "base/compiler_specific.h" | 9 #include "base/compiler_specific.h" |
| 10 #include "base/metrics/histogram.h" | 10 #include "base/metrics/histogram.h" |
| (...skipping 321 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 332 } | 332 } |
| 333 | 333 |
| 334 void FtpNetworkTransaction::ResetStateForRestart() { | 334 void FtpNetworkTransaction::ResetStateForRestart() { |
| 335 command_sent_ = COMMAND_NONE; | 335 command_sent_ = COMMAND_NONE; |
| 336 user_callback_.Reset(); | 336 user_callback_.Reset(); |
| 337 response_ = FtpResponseInfo(); | 337 response_ = FtpResponseInfo(); |
| 338 read_ctrl_buf_ = new IOBuffer(kCtrlBufLen); | 338 read_ctrl_buf_ = new IOBuffer(kCtrlBufLen); |
| 339 ctrl_response_buffer_.reset(new FtpCtrlResponseBuffer(net_log_)); | 339 ctrl_response_buffer_.reset(new FtpCtrlResponseBuffer(net_log_)); |
| 340 read_data_buf_ = NULL; | 340 read_data_buf_ = NULL; |
| 341 read_data_buf_len_ = 0; | 341 read_data_buf_len_ = 0; |
| 342 if (write_buf_) | 342 if (write_buf_.get()) |
| 343 write_buf_->SetOffset(0); | 343 write_buf_->SetOffset(0); |
| 344 last_error_ = OK; | 344 last_error_ = OK; |
| 345 data_connection_port_ = 0; | 345 data_connection_port_ = 0; |
| 346 ctrl_socket_.reset(); | 346 ctrl_socket_.reset(); |
| 347 data_socket_.reset(); | 347 data_socket_.reset(); |
| 348 next_state_ = STATE_NONE; | 348 next_state_ = STATE_NONE; |
| 349 state_after_data_connect_complete_ = STATE_CTRL_WRITE_SIZE; | 349 state_after_data_connect_complete_ = STATE_CTRL_WRITE_SIZE; |
| 350 } | 350 } |
| 351 | 351 |
| 352 void FtpNetworkTransaction::ResetDataConnectionAfterError(State next_state) { | 352 void FtpNetworkTransaction::ResetDataConnectionAfterError(State next_state) { |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 452 | 452 |
| 453 // Used to prepare and send FTP command. | 453 // Used to prepare and send FTP command. |
| 454 int FtpNetworkTransaction::SendFtpCommand(const std::string& command, | 454 int FtpNetworkTransaction::SendFtpCommand(const std::string& command, |
| 455 const std::string& command_for_log, | 455 const std::string& command_for_log, |
| 456 Command cmd) { | 456 Command cmd) { |
| 457 // If we send a new command when we still have unprocessed responses | 457 // If we send a new command when we still have unprocessed responses |
| 458 // for previous commands, the response receiving code will have no way to know | 458 // for previous commands, the response receiving code will have no way to know |
| 459 // which responses are for which command. | 459 // which responses are for which command. |
| 460 DCHECK(!ctrl_response_buffer_->ResponseAvailable()); | 460 DCHECK(!ctrl_response_buffer_->ResponseAvailable()); |
| 461 | 461 |
| 462 DCHECK(!write_command_buf_); | 462 DCHECK(!write_command_buf_.get()); |
| 463 DCHECK(!write_buf_); | 463 DCHECK(!write_buf_.get()); |
| 464 | 464 |
| 465 if (!IsValidFTPCommandString(command)) { | 465 if (!IsValidFTPCommandString(command)) { |
| 466 // Callers should validate the command themselves and return a more specific | 466 // Callers should validate the command themselves and return a more specific |
| 467 // error code. | 467 // error code. |
| 468 NOTREACHED(); | 468 NOTREACHED(); |
| 469 return Stop(ERR_UNEXPECTED); | 469 return Stop(ERR_UNEXPECTED); |
| 470 } | 470 } |
| 471 | 471 |
| 472 command_sent_ = cmd; | 472 command_sent_ = cmd; |
| 473 | 473 |
| 474 write_command_buf_ = new IOBufferWithSize(command.length() + 2); | 474 write_command_buf_ = new IOBufferWithSize(command.length() + 2); |
| 475 write_buf_ = new DrainableIOBuffer(write_command_buf_, | 475 write_buf_ = new DrainableIOBuffer(write_command_buf_.get(), |
| 476 write_command_buf_->size()); | 476 write_command_buf_->size()); |
| 477 memcpy(write_command_buf_->data(), command.data(), command.length()); | 477 memcpy(write_command_buf_->data(), command.data(), command.length()); |
| 478 memcpy(write_command_buf_->data() + command.length(), kCRLF, 2); | 478 memcpy(write_command_buf_->data() + command.length(), kCRLF, 2); |
| 479 | 479 |
| 480 net_log_.AddEvent(NetLog::TYPE_FTP_COMMAND_SENT, | 480 net_log_.AddEvent(NetLog::TYPE_FTP_COMMAND_SENT, |
| 481 NetLog::StringCallback("command", &command_for_log)); | 481 NetLog::StringCallback("command", &command_for_log)); |
| 482 | 482 |
| 483 next_state_ = STATE_CTRL_WRITE; | 483 next_state_ = STATE_CTRL_WRITE; |
| 484 return OK; | 484 return OK; |
| 485 } | 485 } |
| (...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 690 // all future protocols should just use EPSV. | 690 // all future protocols should just use EPSV. |
| 691 use_epsv_ = false; | 691 use_epsv_ = false; |
| 692 } | 692 } |
| 693 } | 693 } |
| 694 } | 694 } |
| 695 return result; | 695 return result; |
| 696 } | 696 } |
| 697 | 697 |
| 698 int FtpNetworkTransaction::DoCtrlRead() { | 698 int FtpNetworkTransaction::DoCtrlRead() { |
| 699 next_state_ = STATE_CTRL_READ_COMPLETE; | 699 next_state_ = STATE_CTRL_READ_COMPLETE; |
| 700 return ctrl_socket_->Read(read_ctrl_buf_, kCtrlBufLen, io_callback_); | 700 return ctrl_socket_->Read(read_ctrl_buf_.get(), kCtrlBufLen, io_callback_); |
| 701 } | 701 } |
| 702 | 702 |
| 703 int FtpNetworkTransaction::DoCtrlReadComplete(int result) { | 703 int FtpNetworkTransaction::DoCtrlReadComplete(int result) { |
| 704 if (result == 0) { | 704 if (result == 0) { |
| 705 // Some servers (for example Pure-FTPd) apparently close the control | 705 // Some servers (for example Pure-FTPd) apparently close the control |
| 706 // connection when anonymous login is not permitted. For more details | 706 // connection when anonymous login is not permitted. For more details |
| 707 // see http://crbug.com/25023. | 707 // see http://crbug.com/25023. |
| 708 if (command_sent_ == COMMAND_USER && | 708 if (command_sent_ == COMMAND_USER && |
| 709 credentials_.username() == ASCIIToUTF16("anonymous")) { | 709 credentials_.username() == ASCIIToUTF16("anonymous")) { |
| 710 response_.needs_auth = true; | 710 response_.needs_auth = true; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 721 next_state_ = STATE_CTRL_READ; | 721 next_state_ = STATE_CTRL_READ; |
| 722 return OK; | 722 return OK; |
| 723 } | 723 } |
| 724 | 724 |
| 725 return ProcessCtrlResponse(); | 725 return ProcessCtrlResponse(); |
| 726 } | 726 } |
| 727 | 727 |
| 728 int FtpNetworkTransaction::DoCtrlWrite() { | 728 int FtpNetworkTransaction::DoCtrlWrite() { |
| 729 next_state_ = STATE_CTRL_WRITE_COMPLETE; | 729 next_state_ = STATE_CTRL_WRITE_COMPLETE; |
| 730 | 730 |
| 731 return ctrl_socket_->Write(write_buf_, | 731 return ctrl_socket_->Write( |
| 732 write_buf_->BytesRemaining(), | 732 write_buf_.get(), write_buf_->BytesRemaining(), io_callback_); |
| 733 io_callback_); | |
| 734 } | 733 } |
| 735 | 734 |
| 736 int FtpNetworkTransaction::DoCtrlWriteComplete(int result) { | 735 int FtpNetworkTransaction::DoCtrlWriteComplete(int result) { |
| 737 if (result < 0) | 736 if (result < 0) |
| 738 return result; | 737 return result; |
| 739 | 738 |
| 740 write_buf_->DidConsume(result); | 739 write_buf_->DidConsume(result); |
| 741 if (write_buf_->BytesRemaining() == 0) { | 740 if (write_buf_->BytesRemaining() == 0) { |
| 742 // Clear the write buffer. | 741 // Clear the write buffer. |
| 743 write_buf_ = NULL; | 742 write_buf_ = NULL; |
| (...skipping 532 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1276 RecordDataConnectionError(result); | 1275 RecordDataConnectionError(result); |
| 1277 | 1276 |
| 1278 if (result != OK) | 1277 if (result != OK) |
| 1279 return Stop(result); | 1278 return Stop(result); |
| 1280 | 1279 |
| 1281 next_state_ = state_after_data_connect_complete_; | 1280 next_state_ = state_after_data_connect_complete_; |
| 1282 return OK; | 1281 return OK; |
| 1283 } | 1282 } |
| 1284 | 1283 |
| 1285 int FtpNetworkTransaction::DoDataRead() { | 1284 int FtpNetworkTransaction::DoDataRead() { |
| 1286 DCHECK(read_data_buf_); | 1285 DCHECK(read_data_buf_.get()); |
| 1287 DCHECK_GT(read_data_buf_len_, 0); | 1286 DCHECK_GT(read_data_buf_len_, 0); |
| 1288 | 1287 |
| 1289 if (data_socket_ == NULL || !data_socket_->IsConnected()) { | 1288 if (data_socket_ == NULL || !data_socket_->IsConnected()) { |
| 1290 // If we don't destroy the data socket completely, some servers will wait | 1289 // If we don't destroy the data socket completely, some servers will wait |
| 1291 // for us (http://crbug.com/21127). The half-closed TCP connection needs | 1290 // for us (http://crbug.com/21127). The half-closed TCP connection needs |
| 1292 // to be closed on our side too. | 1291 // to be closed on our side too. |
| 1293 data_socket_.reset(); | 1292 data_socket_.reset(); |
| 1294 | 1293 |
| 1295 if (ctrl_socket_->IsConnected()) { | 1294 if (ctrl_socket_->IsConnected()) { |
| 1296 // Wait for the server's response, we should get it before sending QUIT. | 1295 // Wait for the server's response, we should get it before sending QUIT. |
| 1297 next_state_ = STATE_CTRL_READ; | 1296 next_state_ = STATE_CTRL_READ; |
| 1298 return OK; | 1297 return OK; |
| 1299 } | 1298 } |
| 1300 | 1299 |
| 1301 // We are no longer connected to the server, so just finish the transaction. | 1300 // We are no longer connected to the server, so just finish the transaction. |
| 1302 return Stop(OK); | 1301 return Stop(OK); |
| 1303 } | 1302 } |
| 1304 | 1303 |
| 1305 next_state_ = STATE_DATA_READ_COMPLETE; | 1304 next_state_ = STATE_DATA_READ_COMPLETE; |
| 1306 read_data_buf_->data()[0] = 0; | 1305 read_data_buf_->data()[0] = 0; |
| 1307 return data_socket_->Read(read_data_buf_, read_data_buf_len_, io_callback_); | 1306 return data_socket_->Read( |
| 1307 read_data_buf_.get(), read_data_buf_len_, io_callback_); |
| 1308 } | 1308 } |
| 1309 | 1309 |
| 1310 int FtpNetworkTransaction::DoDataReadComplete(int result) { | 1310 int FtpNetworkTransaction::DoDataReadComplete(int result) { |
| 1311 return result; | 1311 return result; |
| 1312 } | 1312 } |
| 1313 | 1313 |
| 1314 // We're using a histogram as a group of counters, with one bucket for each | 1314 // We're using a histogram as a group of counters, with one bucket for each |
| 1315 // enumeration value. We're only interested in the values of the counters. | 1315 // enumeration value. We're only interested in the values of the counters. |
| 1316 // Ignore the shape, average, and standard deviation of the histograms because | 1316 // Ignore the shape, average, and standard deviation of the histograms because |
| 1317 // they are meaningless. | 1317 // they are meaningless. |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1393 if (!had_error_type[type]) { | 1393 if (!had_error_type[type]) { |
| 1394 had_error_type[type] = true; | 1394 had_error_type[type] = true; |
| 1395 UMA_HISTOGRAM_ENUMERATION("Net.FtpDataConnectionErrorHappened", | 1395 UMA_HISTOGRAM_ENUMERATION("Net.FtpDataConnectionErrorHappened", |
| 1396 type, NUM_OF_NET_ERROR_TYPES); | 1396 type, NUM_OF_NET_ERROR_TYPES); |
| 1397 } | 1397 } |
| 1398 UMA_HISTOGRAM_ENUMERATION("Net.FtpDataConnectionErrorCount", | 1398 UMA_HISTOGRAM_ENUMERATION("Net.FtpDataConnectionErrorCount", |
| 1399 type, NUM_OF_NET_ERROR_TYPES); | 1399 type, NUM_OF_NET_ERROR_TYPES); |
| 1400 } | 1400 } |
| 1401 | 1401 |
| 1402 } // namespace net | 1402 } // namespace net |
| OLD | NEW |