| 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 #ifndef NET_SOCKET_TRANSPORT_CLIENT_SOCKET_POOL_H_ | 5 #ifndef NET_SOCKET_TRANSPORT_CLIENT_SOCKET_POOL_H_ |
| 6 #define NET_SOCKET_TRANSPORT_CLIENT_SOCKET_POOL_H_ | 6 #define NET_SOCKET_TRANSPORT_CLIENT_SOCKET_POOL_H_ |
| 7 #pragma once | 7 #pragma once |
| 8 | 8 |
| 9 #include <string> | 9 #include <string> |
| 10 | 10 |
| (...skipping 30 matching lines...) Expand all Loading... |
| 41 void Initialize(RequestPriority priority, const GURL& referrer, | 41 void Initialize(RequestPriority priority, const GURL& referrer, |
| 42 bool disable_resolver_cache); | 42 bool disable_resolver_cache); |
| 43 | 43 |
| 44 HostResolver::RequestInfo destination_; | 44 HostResolver::RequestInfo destination_; |
| 45 bool ignore_limits_; | 45 bool ignore_limits_; |
| 46 | 46 |
| 47 DISALLOW_COPY_AND_ASSIGN(TransportSocketParams); | 47 DISALLOW_COPY_AND_ASSIGN(TransportSocketParams); |
| 48 }; | 48 }; |
| 49 | 49 |
| 50 // TransportConnectJob handles the host resolution necessary for socket creation | 50 // TransportConnectJob handles the host resolution necessary for socket creation |
| 51 // and the transport (likely TCP) connect. | 51 // and the transport (likely TCP) connect. TransportConnectJob also has fallback |
| 52 // logic for IPv6 connect() timeouts (which may happen due to networks / routers |
| 53 // with broken IPv6 support). Those timeouts take 20s, so rather than make the |
| 54 // user wait 20s for the timeout to fire, we use a fallback timer |
| 55 // (kIPv6FallbackTimerInMs) and start a connect() to a IPv4 address if the timer |
| 56 // fires. Then we race the IPv4 connect() against the IPv6 connect() (which has |
| 57 // a headstart) and return the one that completes first to the socket pool. |
| 52 class TransportConnectJob : public ConnectJob { | 58 class TransportConnectJob : public ConnectJob { |
| 53 public: | 59 public: |
| 54 TransportConnectJob(const std::string& group_name, | 60 TransportConnectJob(const std::string& group_name, |
| 55 const scoped_refptr<TransportSocketParams>& params, | 61 const scoped_refptr<TransportSocketParams>& params, |
| 56 base::TimeDelta timeout_duration, | 62 base::TimeDelta timeout_duration, |
| 57 ClientSocketFactory* client_socket_factory, | 63 ClientSocketFactory* client_socket_factory, |
| 58 HostResolver* host_resolver, | 64 HostResolver* host_resolver, |
| 59 Delegate* delegate, | 65 Delegate* delegate, |
| 60 NetLog* net_log); | 66 NetLog* net_log); |
| 61 virtual ~TransportConnectJob(); | 67 virtual ~TransportConnectJob(); |
| 62 | 68 |
| 63 // ConnectJob methods. | 69 // ConnectJob methods. |
| 64 virtual LoadState GetLoadState() const; | 70 virtual LoadState GetLoadState() const; |
| 65 | 71 |
| 72 // Makes |addrlist| start with an IPv4 address if |addrlist| contains any |
| 73 // IPv4 address. |
| 74 // |
| 75 // WARNING: this method should only be used to implement the prefer-IPv4 |
| 76 // hack. It is a public method for the unit tests. |
| 77 static void MakeAddrListStartWithIPv4(AddressList* addrlist); |
| 78 |
| 79 static const int kIPv6FallbackTimerInMs; |
| 80 |
| 66 private: | 81 private: |
| 67 enum State { | 82 enum State { |
| 68 STATE_RESOLVE_HOST, | 83 STATE_RESOLVE_HOST, |
| 69 STATE_RESOLVE_HOST_COMPLETE, | 84 STATE_RESOLVE_HOST_COMPLETE, |
| 70 STATE_TRANSPORT_CONNECT, | 85 STATE_TRANSPORT_CONNECT, |
| 71 STATE_TRANSPORT_CONNECT_COMPLETE, | 86 STATE_TRANSPORT_CONNECT_COMPLETE, |
| 72 STATE_NONE, | 87 STATE_NONE, |
| 73 }; | 88 }; |
| 74 | 89 |
| 75 void OnIOComplete(int result); | 90 void OnIOComplete(int result); |
| 76 | 91 |
| 77 // Runs the state transition loop. | 92 // Runs the state transition loop. |
| 78 int DoLoop(int result); | 93 int DoLoop(int result); |
| 79 | 94 |
| 80 int DoResolveHost(); | 95 int DoResolveHost(); |
| 81 int DoResolveHostComplete(int result); | 96 int DoResolveHostComplete(int result); |
| 82 int DoTransportConnect(); | 97 int DoTransportConnect(); |
| 83 int DoTransportConnectComplete(int result); | 98 int DoTransportConnectComplete(int result); |
| 84 | 99 |
| 100 // Not part of the state machine. |
| 101 void DoIPv6FallbackTransportConnect(); |
| 102 void DoIPv6FallbackTransportConnectComplete(int result); |
| 103 |
| 85 // Begins the host resolution and the TCP connect. Returns OK on success | 104 // Begins the host resolution and the TCP connect. Returns OK on success |
| 86 // and ERR_IO_PENDING if it cannot immediately service the request. | 105 // and ERR_IO_PENDING if it cannot immediately service the request. |
| 87 // Otherwise, it returns a net error code. | 106 // Otherwise, it returns a net error code. |
| 88 virtual int ConnectInternal(); | 107 virtual int ConnectInternal(); |
| 89 | 108 |
| 90 scoped_refptr<TransportSocketParams> params_; | 109 scoped_refptr<TransportSocketParams> params_; |
| 91 ClientSocketFactory* const client_socket_factory_; | 110 ClientSocketFactory* const client_socket_factory_; |
| 92 CompletionCallbackImpl<TransportConnectJob> callback_; | 111 CompletionCallbackImpl<TransportConnectJob> callback_; |
| 93 SingleRequestHostResolver resolver_; | 112 SingleRequestHostResolver resolver_; |
| 94 AddressList addresses_; | 113 AddressList addresses_; |
| 95 State next_state_; | 114 State next_state_; |
| 96 | 115 |
| 97 // The time Connect() was called. | 116 // The time Connect() was called. |
| 98 base::TimeTicks start_time_; | 117 base::TimeTicks start_time_; |
| 99 | 118 |
| 100 // The time the connect was started (after DNS finished). | 119 // The time the connect was started (after DNS finished). |
| 101 base::TimeTicks connect_start_time_; | 120 base::TimeTicks connect_start_time_; |
| 102 | 121 |
| 122 scoped_ptr<ClientSocket> transport_socket_; |
| 123 |
| 124 scoped_ptr<ClientSocket> fallback_transport_socket_; |
| 125 scoped_ptr<AddressList> fallback_addresses_; |
| 126 CompletionCallbackImpl<TransportConnectJob> fallback_callback_; |
| 127 base::TimeTicks fallback_connect_start_time_; |
| 128 base::OneShotTimer<TransportConnectJob> fallback_timer_; |
| 129 |
| 103 DISALLOW_COPY_AND_ASSIGN(TransportConnectJob); | 130 DISALLOW_COPY_AND_ASSIGN(TransportConnectJob); |
| 104 }; | 131 }; |
| 105 | 132 |
| 106 class TransportClientSocketPool : public ClientSocketPool { | 133 class TransportClientSocketPool : public ClientSocketPool { |
| 107 public: | 134 public: |
| 108 TransportClientSocketPool( | 135 TransportClientSocketPool( |
| 109 int max_sockets, | 136 int max_sockets, |
| 110 int max_sockets_per_group, | 137 int max_sockets_per_group, |
| 111 ClientSocketPoolHistograms* histograms, | 138 ClientSocketPoolHistograms* histograms, |
| 112 HostResolver* host_resolver, | 139 HostResolver* host_resolver, |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 191 | 218 |
| 192 DISALLOW_COPY_AND_ASSIGN(TransportClientSocketPool); | 219 DISALLOW_COPY_AND_ASSIGN(TransportClientSocketPool); |
| 193 }; | 220 }; |
| 194 | 221 |
| 195 REGISTER_SOCKET_PARAMS_FOR_POOL(TransportClientSocketPool, | 222 REGISTER_SOCKET_PARAMS_FOR_POOL(TransportClientSocketPool, |
| 196 TransportSocketParams); | 223 TransportSocketParams); |
| 197 | 224 |
| 198 } // namespace net | 225 } // namespace net |
| 199 | 226 |
| 200 #endif // NET_SOCKET_TRANSPORT_CLIENT_SOCKET_POOL_H_ | 227 #endif // NET_SOCKET_TRANSPORT_CLIENT_SOCKET_POOL_H_ |
| OLD | NEW |