OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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/compiler_specific.h" | 7 #include "base/compiler_specific.h" |
8 #include "base/histogram.h" | 8 #include "base/histogram.h" |
9 #include "base/string_util.h" | 9 #include "base/string_util.h" |
10 #include "base/utf_string_conversions.h" | 10 #include "base/utf_string_conversions.h" |
(...skipping 1169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1180 int rv = ctrl_socket_->GetPeerAddress(&data_address); | 1180 int rv = ctrl_socket_->GetPeerAddress(&data_address); |
1181 if (rv != OK) | 1181 if (rv != OK) |
1182 return Stop(rv); | 1182 return Stop(rv); |
1183 data_address.SetPort(data_connection_port_); | 1183 data_address.SetPort(data_connection_port_); |
1184 data_socket_.reset(socket_factory_->CreateTCPClientSocket( | 1184 data_socket_.reset(socket_factory_->CreateTCPClientSocket( |
1185 data_address, net_log_.net_log())); | 1185 data_address, net_log_.net_log())); |
1186 return data_socket_->Connect(&io_callback_); | 1186 return data_socket_->Connect(&io_callback_); |
1187 } | 1187 } |
1188 | 1188 |
1189 int FtpNetworkTransaction::DoDataConnectComplete(int result) { | 1189 int FtpNetworkTransaction::DoDataConnectComplete(int result) { |
| 1190 if (result == ERR_CONNECTION_TIMED_OUT && use_epsv_) { |
| 1191 // It's possible we hit a broken server, sadly. Fall back to PASV. |
| 1192 // TODO(phajdan.jr): remember it for future transactions with this server. |
| 1193 // TODO(phajdan.jr): write a test for this code path. |
| 1194 use_epsv_ = false; |
| 1195 next_state_ = STATE_CTRL_WRITE_PASV; |
| 1196 return OK; |
| 1197 } |
| 1198 |
| 1199 // Only record the connection error after we've applied all our fallbacks. |
| 1200 // We want to capture the final error, one we're not going to recover from. |
1190 RecordDataConnectionError(result); | 1201 RecordDataConnectionError(result); |
| 1202 |
| 1203 if (result != OK) |
| 1204 return Stop(result); |
| 1205 |
1191 next_state_ = STATE_CTRL_WRITE_SIZE; | 1206 next_state_ = STATE_CTRL_WRITE_SIZE; |
1192 return OK; | 1207 return OK; |
1193 } | 1208 } |
1194 | 1209 |
1195 int FtpNetworkTransaction::DoDataRead() { | 1210 int FtpNetworkTransaction::DoDataRead() { |
1196 DCHECK(read_data_buf_); | 1211 DCHECK(read_data_buf_); |
1197 DCHECK_GT(read_data_buf_len_, 0); | 1212 DCHECK_GT(read_data_buf_len_, 0); |
1198 | 1213 |
1199 if (data_socket_ == NULL || !data_socket_->IsConnected()) { | 1214 if (data_socket_ == NULL || !data_socket_->IsConnected()) { |
1200 // If we don't destroy the data socket completely, some servers will wait | 1215 // If we don't destroy the data socket completely, some servers will wait |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1303 if (!had_error_type[type]) { | 1318 if (!had_error_type[type]) { |
1304 had_error_type[type] = true; | 1319 had_error_type[type] = true; |
1305 UMA_HISTOGRAM_ENUMERATION("Net.FtpDataConnectionErrorHappened", | 1320 UMA_HISTOGRAM_ENUMERATION("Net.FtpDataConnectionErrorHappened", |
1306 type, NUM_OF_NET_ERROR_TYPES); | 1321 type, NUM_OF_NET_ERROR_TYPES); |
1307 } | 1322 } |
1308 UMA_HISTOGRAM_ENUMERATION("Net.FtpDataConnectionErrorCount", | 1323 UMA_HISTOGRAM_ENUMERATION("Net.FtpDataConnectionErrorCount", |
1309 type, NUM_OF_NET_ERROR_TYPES); | 1324 type, NUM_OF_NET_ERROR_TYPES); |
1310 } | 1325 } |
1311 | 1326 |
1312 } // namespace net | 1327 } // namespace net |
OLD | NEW |