OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/socket/transport_client_socket_pool.h" | 5 #include "net/socket/transport_client_socket_pool.h" |
6 | 6 |
7 #include "base/compiler_specific.h" | 7 #include "base/compiler_specific.h" |
8 #include "base/logging.h" | 8 #include "base/logging.h" |
9 #include "base/message_loop.h" | 9 #include "base/message_loop.h" |
10 #include "base/metrics/histogram.h" | 10 #include "base/metrics/histogram.h" |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
92 const scoped_refptr<TransportSocketParams>& params, | 92 const scoped_refptr<TransportSocketParams>& params, |
93 base::TimeDelta timeout_duration, | 93 base::TimeDelta timeout_duration, |
94 ClientSocketFactory* client_socket_factory, | 94 ClientSocketFactory* client_socket_factory, |
95 HostResolver* host_resolver, | 95 HostResolver* host_resolver, |
96 Delegate* delegate, | 96 Delegate* delegate, |
97 NetLog* net_log) | 97 NetLog* net_log) |
98 : ConnectJob(group_name, timeout_duration, delegate, | 98 : ConnectJob(group_name, timeout_duration, delegate, |
99 BoundNetLog::Make(net_log, NetLog::SOURCE_CONNECT_JOB)), | 99 BoundNetLog::Make(net_log, NetLog::SOURCE_CONNECT_JOB)), |
100 params_(params), | 100 params_(params), |
101 client_socket_factory_(client_socket_factory), | 101 client_socket_factory_(client_socket_factory), |
102 ALLOW_THIS_IN_INITIALIZER_LIST( | 102 resolver_(host_resolver) {} |
103 callback_(this, | |
104 &TransportConnectJob::OnIOComplete)), | |
105 resolver_(host_resolver), | |
106 ALLOW_THIS_IN_INITIALIZER_LIST( | |
107 fallback_callback_( | |
108 this, | |
109 &TransportConnectJob::DoIPv6FallbackTransportConnectComplete)) {} | |
110 | 103 |
111 TransportConnectJob::~TransportConnectJob() { | 104 TransportConnectJob::~TransportConnectJob() { |
112 // We don't worry about cancelling the host resolution and TCP connect, since | 105 // We don't worry about cancelling the host resolution and TCP connect, since |
113 // ~SingleRequestHostResolver and ~StreamSocket will take care of it. | 106 // ~SingleRequestHostResolver and ~StreamSocket will take care of it. |
114 } | 107 } |
115 | 108 |
116 LoadState TransportConnectJob::GetLoadState() const { | 109 LoadState TransportConnectJob::GetLoadState() const { |
117 switch (next_state_) { | 110 switch (next_state_) { |
118 case STATE_RESOLVE_HOST: | 111 case STATE_RESOLVE_HOST: |
119 case STATE_RESOLVE_HOST_COMPLETE: | 112 case STATE_RESOLVE_HOST_COMPLETE: |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
209 if (result == OK) | 202 if (result == OK) |
210 next_state_ = STATE_TRANSPORT_CONNECT; | 203 next_state_ = STATE_TRANSPORT_CONNECT; |
211 return result; | 204 return result; |
212 } | 205 } |
213 | 206 |
214 int TransportConnectJob::DoTransportConnect() { | 207 int TransportConnectJob::DoTransportConnect() { |
215 next_state_ = STATE_TRANSPORT_CONNECT_COMPLETE; | 208 next_state_ = STATE_TRANSPORT_CONNECT_COMPLETE; |
216 transport_socket_.reset(client_socket_factory_->CreateTransportClientSocket( | 209 transport_socket_.reset(client_socket_factory_->CreateTransportClientSocket( |
217 addresses_, net_log().net_log(), net_log().source())); | 210 addresses_, net_log().net_log(), net_log().source())); |
218 connect_start_time_ = base::TimeTicks::Now(); | 211 connect_start_time_ = base::TimeTicks::Now(); |
219 int rv = transport_socket_->Connect(&callback_); | 212 int rv = transport_socket_->Connect( |
| 213 base::Bind(&TransportConnectJob::OnIOComplete, base::Unretained(this))); |
220 if (rv == ERR_IO_PENDING && | 214 if (rv == ERR_IO_PENDING && |
221 AddressListStartsWithIPv6AndHasAnIPv4Addr(addresses_)) { | 215 AddressListStartsWithIPv6AndHasAnIPv4Addr(addresses_)) { |
222 fallback_timer_.Start(FROM_HERE, | 216 fallback_timer_.Start(FROM_HERE, |
223 base::TimeDelta::FromMilliseconds(kIPv6FallbackTimerInMs), | 217 base::TimeDelta::FromMilliseconds(kIPv6FallbackTimerInMs), |
224 this, &TransportConnectJob::DoIPv6FallbackTransportConnect); | 218 this, &TransportConnectJob::DoIPv6FallbackTransportConnect); |
225 } | 219 } |
226 return rv; | 220 return rv; |
227 } | 221 } |
228 | 222 |
229 int TransportConnectJob::DoTransportConnectComplete(int result) { | 223 int TransportConnectJob::DoTransportConnectComplete(int result) { |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
289 | 283 |
290 DCHECK(!fallback_transport_socket_.get()); | 284 DCHECK(!fallback_transport_socket_.get()); |
291 DCHECK(!fallback_addresses_.get()); | 285 DCHECK(!fallback_addresses_.get()); |
292 | 286 |
293 fallback_addresses_.reset(new AddressList(addresses_)); | 287 fallback_addresses_.reset(new AddressList(addresses_)); |
294 MakeAddrListStartWithIPv4(fallback_addresses_.get()); | 288 MakeAddrListStartWithIPv4(fallback_addresses_.get()); |
295 fallback_transport_socket_.reset( | 289 fallback_transport_socket_.reset( |
296 client_socket_factory_->CreateTransportClientSocket( | 290 client_socket_factory_->CreateTransportClientSocket( |
297 *fallback_addresses_, net_log().net_log(), net_log().source())); | 291 *fallback_addresses_, net_log().net_log(), net_log().source())); |
298 fallback_connect_start_time_ = base::TimeTicks::Now(); | 292 fallback_connect_start_time_ = base::TimeTicks::Now(); |
299 int rv = fallback_transport_socket_->Connect(&fallback_callback_); | 293 int rv = fallback_transport_socket_->Connect( |
| 294 base::Bind( |
| 295 &TransportConnectJob::DoIPv6FallbackTransportConnectComplete, |
| 296 base::Unretained(this))); |
300 if (rv != ERR_IO_PENDING) | 297 if (rv != ERR_IO_PENDING) |
301 DoIPv6FallbackTransportConnectComplete(rv); | 298 DoIPv6FallbackTransportConnectComplete(rv); |
302 } | 299 } |
303 | 300 |
304 void TransportConnectJob::DoIPv6FallbackTransportConnectComplete(int result) { | 301 void TransportConnectJob::DoIPv6FallbackTransportConnectComplete(int result) { |
305 // This should only happen when we're waiting for the main connect to succeed. | 302 // This should only happen when we're waiting for the main connect to succeed. |
306 if (next_state_ != STATE_TRANSPORT_CONNECT_COMPLETE) { | 303 if (next_state_ != STATE_TRANSPORT_CONNECT_COMPLETE) { |
307 NOTREACHED(); | 304 NOTREACHED(); |
308 return; | 305 return; |
309 } | 306 } |
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
489 | 486 |
490 base::TimeDelta TransportClientSocketPool::ConnectionTimeout() const { | 487 base::TimeDelta TransportClientSocketPool::ConnectionTimeout() const { |
491 return base_.ConnectionTimeout(); | 488 return base_.ConnectionTimeout(); |
492 } | 489 } |
493 | 490 |
494 ClientSocketPoolHistograms* TransportClientSocketPool::histograms() const { | 491 ClientSocketPoolHistograms* TransportClientSocketPool::histograms() const { |
495 return base_.histograms(); | 492 return base_.histograms(); |
496 } | 493 } |
497 | 494 |
498 } // namespace net | 495 } // namespace net |
OLD | NEW |