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 #ifndef NET_SOCKET_SSL_CLIENT_SOCKET_POOL_H_ | 5 #ifndef NET_SOCKET_SSL_CLIENT_SOCKET_POOL_H_ |
6 #define NET_SOCKET_SSL_CLIENT_SOCKET_POOL_H_ | 6 #define NET_SOCKET_SSL_CLIENT_SOCKET_POOL_H_ |
7 | 7 |
8 #include <map> | 8 #include <map> |
9 #include <string> | 9 #include <string> |
10 #include <vector> | 10 #include <vector> |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
109 SSLClientSocket* socket; | 109 SSLClientSocket* socket; |
110 base::Closure callback; | 110 base::Closure callback; |
111 | 111 |
112 SocketAndCallback(SSLClientSocket* ssl_socket, | 112 SocketAndCallback(SSLClientSocket* ssl_socket, |
113 base::Closure job_resumption_callback) | 113 base::Closure job_resumption_callback) |
114 : socket(ssl_socket), callback(job_resumption_callback) {} | 114 : socket(ssl_socket), callback(job_resumption_callback) {} |
115 }; | 115 }; |
116 | 116 |
117 typedef std::vector<SocketAndCallback> SSLPendingSocketsAndCallbacks; | 117 typedef std::vector<SocketAndCallback> SSLPendingSocketsAndCallbacks; |
118 | 118 |
119 // Returns true if |ssl_socket|'s Connect() method should be called. | 119 SSLConnectJobMessenger(); |
| 120 |
| 121 // Returns true if the given |ssl_socket| should continue its |
| 122 // SSL connection. |
120 bool CanProceed(SSLClientSocket* ssl_socket); | 123 bool CanProceed(SSLClientSocket* ssl_socket); |
121 | 124 |
122 // Configure the SSLConnectJobMessenger to begin monitoring |ssl_socket|'s | 125 // Configure the SSLConnectJobMessenger to begin monitoring |ssl_socket|'s |
123 // connection status. After a successful connection, or an error, | 126 // connection status. After a successful connection, or an error, |
124 // the messenger will determine which sockets that have been added | 127 // the messenger will determine which sockets that have been added |
125 // via AddPendingSocket() to allow to proceed, notifying the associated | 128 // via AddPendingSocket() to allow to proceed, notifying the associated |
126 // callback asynchronously, so that the caller can call Connect() on them. | 129 // callback asynchronously, so that the caller can call Connect() on them. |
127 void MonitorConnectionResult(SSLClientSocket* ssl_socket); | 130 void MonitorConnectionResult(SSLClientSocket* ssl_socket); |
128 | 131 |
129 // Adds |socket| to the list of sockets waiting to Connect(). When | 132 // Adds |socket| to the list of sockets waiting to Connect(). When |
130 // the messenger has determined that it's an appropriate time for |socket| | 133 // the messenger has determined that it's an appropriate time for |socket| |
131 // to connect, it will asynchronously invoke |callback|. Callers should | 134 // to connect, it will asynchronously invoke |callback|. Callers should |
132 // then proceed to call Connect() and establish the socket. | 135 // then proceed to call Connect() and establish the socket. |
133 // | 136 // |
134 // Note: It is an error to call AddPendingSocket() without having first | 137 // Note: It is an error to call AddPendingSocket() without having first |
135 // called MonitorConnectionResult() and configuring a socket that WILL | 138 // called MonitorConnectionResult() and configuring a socket that WILL |
136 // have Connect() called on it. | 139 // have Connect() called on it. |
137 void AddPendingSocket(SSLClientSocket* socket, const base::Closure& callback); | 140 void AddPendingSocket(SSLClientSocket* socket, const base::Closure& callback); |
138 | 141 |
| 142 // Posts a task to process pending callbacks when a socket encounters an error |
| 143 // while completing its connection. |
| 144 void OnJobFailed(); |
| 145 |
| 146 private: |
139 // Processes pending callbacks when a socket successfully completes | 147 // Processes pending callbacks when a socket successfully completes |
140 // its connection. | 148 // its connection. |
141 void OnJobSucceeded(); | 149 void OnJobSucceeded(); |
142 | 150 |
143 // Processes pending callbacks when a socket encounters an error | 151 // Determines which pending socket should be the next leading connection, |
144 // while completing its connection. | 152 // and runs that socket's resumption callback. |
145 void OnJobFailed(); | 153 void ConnectNewLeader(); |
146 | 154 |
147 private: | |
148 // Runs all callbacks stored in |pending_sockets_and_callbacks_|. | 155 // Runs all callbacks stored in |pending_sockets_and_callbacks_|. |
149 void RunAllJobs(std::vector<SocketAndCallback>& pending_socket_and_callbacks); | 156 void RunAllJobs( |
| 157 std::vector<SocketAndCallback>& pending_sockets_and_callbacks); |
150 | 158 |
| 159 base::WeakPtrFactory<SSLConnectJobMessenger> weak_factory_; |
151 SSLPendingSocketsAndCallbacks pending_sockets_and_callbacks_; | 160 SSLPendingSocketsAndCallbacks pending_sockets_and_callbacks_; |
152 std::vector<SSLClientSocket*> connecting_sockets_; | 161 std::vector<SSLClientSocket*> connecting_sockets_; |
153 }; | 162 }; |
154 | 163 |
155 // SSLConnectJob handles the SSL handshake after setting up the underlying | 164 // SSLConnectJob handles the SSL handshake after setting up the underlying |
156 // connection as specified in the params. | 165 // connection as specified in the params. |
157 class SSLConnectJob : public ConnectJob { | 166 class SSLConnectJob : public ConnectJob { |
158 public: | 167 public: |
159 // Note: the SSLConnectJob does not own |messenger|. | 168 // Note: the SSLConnectJob does not own |messenger|. |
160 // so it must outlive the job. | 169 // so it must outlive the job. |
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
382 const scoped_refptr<SSLConfigService> ssl_config_service_; | 391 const scoped_refptr<SSLConfigService> ssl_config_service_; |
383 | 392 |
384 static bool enable_connect_job_waiting_; | 393 static bool enable_connect_job_waiting_; |
385 | 394 |
386 DISALLOW_COPY_AND_ASSIGN(SSLClientSocketPool); | 395 DISALLOW_COPY_AND_ASSIGN(SSLClientSocketPool); |
387 }; | 396 }; |
388 | 397 |
389 } // namespace net | 398 } // namespace net |
390 | 399 |
391 #endif // NET_SOCKET_SSL_CLIENT_SOCKET_POOL_H_ | 400 #endif // NET_SOCKET_SSL_CLIENT_SOCKET_POOL_H_ |
OLD | NEW |