Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(576)

Side by Side Diff: net/socket/client_socket_pool_manager.cc

Issue 7024017: Fix --host-rules command switch. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: s/create/Create/ Created 9 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/socket/client_socket_pool_manager.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 // ClientSocketPoolManager manages access to all ClientSocketPools. It's a 5 // ClientSocketPoolManager manages access to all ClientSocketPools. It's a
6 // simple container for all of them. Most importantly, it handles the lifetime 6 // simple container for all of them. Most importantly, it handles the lifetime
7 // and destruction order properly. 7 // and destruction order properly.
8 8
9 #include "net/socket/client_socket_pool_manager.h" 9 #include "net/socket/client_socket_pool_manager.h"
10 10
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
51 for (typename MapType::const_iterator it = socket_pools.begin(); 51 for (typename MapType::const_iterator it = socket_pools.begin();
52 it != socket_pools.end(); it++) { 52 it != socket_pools.end(); it++) {
53 list->Append(it->second->GetInfoAsValue(it->first.ToString(), 53 list->Append(it->second->GetInfoAsValue(it->first.ToString(),
54 type, 54 type,
55 include_nested_pools)); 55 include_nested_pools));
56 } 56 }
57 } 57 }
58 58
59 // The meat of the implementation for the InitSocketHandleForHttpRequest, 59 // The meat of the implementation for the InitSocketHandleForHttpRequest,
60 // InitSocketHandleForRawConnect and PreconnectSocketsForHttpRequest methods. 60 // InitSocketHandleForRawConnect and PreconnectSocketsForHttpRequest methods.
61 int InitSocketPoolHelper(const HttpRequestInfo& request_info, 61 int InitSocketPoolHelper(const GURL& request_url,
62 const GURL& request_referrer,
63 const HttpRequestHeaders& request_extra_headers,
64 int request_load_flags,
65 RequestPriority request_priority,
62 HttpNetworkSession* session, 66 HttpNetworkSession* session,
63 const ProxyInfo& proxy_info, 67 const ProxyInfo& proxy_info,
64 bool force_spdy_over_ssl, 68 bool force_spdy_over_ssl,
65 bool want_spdy_over_npn, 69 bool want_spdy_over_npn,
66 const SSLConfig& ssl_config_for_origin, 70 const SSLConfig& ssl_config_for_origin,
67 const SSLConfig& ssl_config_for_proxy, 71 const SSLConfig& ssl_config_for_proxy,
68 bool force_tunnel, 72 bool force_tunnel,
69 const BoundNetLog& net_log, 73 const BoundNetLog& net_log,
70 int num_preconnect_streams, 74 int num_preconnect_streams,
71 ClientSocketHandle* socket_handle, 75 ClientSocketHandle* socket_handle,
72 CompletionCallback* callback) { 76 CompletionCallback* callback) {
73 scoped_refptr<TransportSocketParams> tcp_params; 77 scoped_refptr<TransportSocketParams> tcp_params;
74 scoped_refptr<HttpProxySocketParams> http_proxy_params; 78 scoped_refptr<HttpProxySocketParams> http_proxy_params;
75 scoped_refptr<SOCKSSocketParams> socks_params; 79 scoped_refptr<SOCKSSocketParams> socks_params;
76 scoped_ptr<HostPortPair> proxy_host_port; 80 scoped_ptr<HostPortPair> proxy_host_port;
77 81
78 bool using_ssl = request_info.url.SchemeIs("https") || force_spdy_over_ssl; 82 bool using_ssl = request_url.SchemeIs("https") || force_spdy_over_ssl;
79 83
80 HostPortPair origin_host_port = 84 HostPortPair origin_host_port =
81 HostPortPair(request_info.url.HostNoBrackets(), 85 HostPortPair(request_url.HostNoBrackets(),
82 request_info.url.EffectiveIntPort()); 86 request_url.EffectiveIntPort());
83 87
84 bool disable_resolver_cache = 88 bool disable_resolver_cache =
85 request_info.load_flags & LOAD_BYPASS_CACHE || 89 request_load_flags & LOAD_BYPASS_CACHE ||
86 request_info.load_flags & LOAD_VALIDATE_CACHE || 90 request_load_flags & LOAD_VALIDATE_CACHE ||
87 request_info.load_flags & LOAD_DISABLE_CACHE; 91 request_load_flags & LOAD_DISABLE_CACHE;
88 92
89 int load_flags = request_info.load_flags; 93 int load_flags = request_load_flags;
90 if (HttpStreamFactory::ignore_certificate_errors()) 94 if (HttpStreamFactory::ignore_certificate_errors())
91 load_flags |= LOAD_IGNORE_ALL_CERT_ERRORS; 95 load_flags |= LOAD_IGNORE_ALL_CERT_ERRORS;
92 96
93 // Build the string used to uniquely identify connections of this type. 97 // Build the string used to uniquely identify connections of this type.
94 // Determine the host and port to connect to. 98 // Determine the host and port to connect to.
95 std::string connection_group = origin_host_port.ToString(); 99 std::string connection_group = origin_host_port.ToString();
96 DCHECK(!connection_group.empty()); 100 DCHECK(!connection_group.empty());
97 if (using_ssl) 101 if (using_ssl)
98 connection_group = base::StringPrintf("ssl/%s", connection_group.c_str()); 102 connection_group = base::StringPrintf("ssl/%s", connection_group.c_str());
99 103
100 bool ignore_limits = (request_info.load_flags & LOAD_IGNORE_LIMITS) != 0; 104 bool ignore_limits = (request_load_flags & LOAD_IGNORE_LIMITS) != 0;
101 if (proxy_info.is_direct()) { 105 if (proxy_info.is_direct()) {
102 tcp_params = new TransportSocketParams(origin_host_port, 106 tcp_params = new TransportSocketParams(origin_host_port,
103 request_info.priority, 107 request_priority,
104 request_info.referrer, 108 request_referrer,
105 disable_resolver_cache, 109 disable_resolver_cache,
106 ignore_limits); 110 ignore_limits);
107 } else { 111 } else {
108 ProxyServer proxy_server = proxy_info.proxy_server(); 112 ProxyServer proxy_server = proxy_info.proxy_server();
109 proxy_host_port.reset(new HostPortPair(proxy_server.host_port_pair())); 113 proxy_host_port.reset(new HostPortPair(proxy_server.host_port_pair()));
110 scoped_refptr<TransportSocketParams> proxy_tcp_params( 114 scoped_refptr<TransportSocketParams> proxy_tcp_params(
111 new TransportSocketParams(*proxy_host_port, 115 new TransportSocketParams(*proxy_host_port,
112 request_info.priority, 116 request_priority,
113 request_info.referrer, 117 request_referrer,
114 disable_resolver_cache, 118 disable_resolver_cache,
115 ignore_limits)); 119 ignore_limits));
116 120
117 if (proxy_info.is_http() || proxy_info.is_https()) { 121 if (proxy_info.is_http() || proxy_info.is_https()) {
118 std::string user_agent; 122 std::string user_agent;
119 request_info.extra_headers.GetHeader(HttpRequestHeaders::kUserAgent, 123 request_extra_headers.GetHeader(HttpRequestHeaders::kUserAgent,
120 &user_agent); 124 &user_agent);
121 scoped_refptr<SSLSocketParams> ssl_params; 125 scoped_refptr<SSLSocketParams> ssl_params;
122 if (proxy_info.is_https()) { 126 if (proxy_info.is_https()) {
123 // Set ssl_params, and unset proxy_tcp_params 127 // Set ssl_params, and unset proxy_tcp_params
124 ssl_params = new SSLSocketParams(proxy_tcp_params, 128 ssl_params = new SSLSocketParams(proxy_tcp_params,
125 NULL, 129 NULL,
126 NULL, 130 NULL,
127 ProxyServer::SCHEME_DIRECT, 131 ProxyServer::SCHEME_DIRECT,
128 *proxy_host_port.get(), 132 *proxy_host_port.get(),
129 ssl_config_for_proxy, 133 ssl_config_for_proxy,
130 load_flags, 134 load_flags,
131 force_spdy_over_ssl, 135 force_spdy_over_ssl,
132 want_spdy_over_npn); 136 want_spdy_over_npn);
133 proxy_tcp_params = NULL; 137 proxy_tcp_params = NULL;
134 } 138 }
135 139
136 http_proxy_params = 140 http_proxy_params =
137 new HttpProxySocketParams(proxy_tcp_params, 141 new HttpProxySocketParams(proxy_tcp_params,
138 ssl_params, 142 ssl_params,
139 request_info.url, 143 request_url,
140 user_agent, 144 user_agent,
141 origin_host_port, 145 origin_host_port,
142 session->http_auth_cache(), 146 session->http_auth_cache(),
143 session->http_auth_handler_factory(), 147 session->http_auth_handler_factory(),
144 session->spdy_session_pool(), 148 session->spdy_session_pool(),
145 force_tunnel || using_ssl); 149 force_tunnel || using_ssl);
146 } else { 150 } else {
147 DCHECK(proxy_info.is_socks()); 151 DCHECK(proxy_info.is_socks());
148 char socks_version; 152 char socks_version;
149 if (proxy_server.scheme() == ProxyServer::SCHEME_SOCKS5) 153 if (proxy_server.scheme() == ProxyServer::SCHEME_SOCKS5)
150 socks_version = '5'; 154 socks_version = '5';
151 else 155 else
152 socks_version = '4'; 156 socks_version = '4';
153 connection_group = base::StringPrintf( 157 connection_group = base::StringPrintf(
154 "socks%c/%s", socks_version, connection_group.c_str()); 158 "socks%c/%s", socks_version, connection_group.c_str());
155 159
156 socks_params = new SOCKSSocketParams(proxy_tcp_params, 160 socks_params = new SOCKSSocketParams(proxy_tcp_params,
157 socks_version == '5', 161 socks_version == '5',
158 origin_host_port, 162 origin_host_port,
159 request_info.priority, 163 request_priority,
160 request_info.referrer); 164 request_referrer);
161 } 165 }
162 } 166 }
163 167
164 // Deal with SSL - which layers on top of any given proxy. 168 // Deal with SSL - which layers on top of any given proxy.
165 if (using_ssl) { 169 if (using_ssl) {
166 scoped_refptr<SSLSocketParams> ssl_params = 170 scoped_refptr<SSLSocketParams> ssl_params =
167 new SSLSocketParams(tcp_params, 171 new SSLSocketParams(tcp_params,
168 socks_params, 172 socks_params,
169 http_proxy_params, 173 http_proxy_params,
170 proxy_info.proxy_server().scheme(), 174 proxy_info.proxy_server().scheme(),
171 origin_host_port, 175 origin_host_port,
172 ssl_config_for_origin, 176 ssl_config_for_origin,
173 load_flags, 177 load_flags,
174 force_spdy_over_ssl, 178 force_spdy_over_ssl,
175 want_spdy_over_npn); 179 want_spdy_over_npn);
176 SSLClientSocketPool* ssl_pool = NULL; 180 SSLClientSocketPool* ssl_pool = NULL;
177 if (proxy_info.is_direct()) 181 if (proxy_info.is_direct())
178 ssl_pool = session->ssl_socket_pool(); 182 ssl_pool = session->ssl_socket_pool();
179 else 183 else
180 ssl_pool = session->GetSocketPoolForSSLWithProxy(*proxy_host_port); 184 ssl_pool = session->GetSocketPoolForSSLWithProxy(*proxy_host_port);
181 185
182 if (num_preconnect_streams) { 186 if (num_preconnect_streams) {
183 RequestSocketsForPool(ssl_pool, connection_group, ssl_params, 187 RequestSocketsForPool(ssl_pool, connection_group, ssl_params,
184 num_preconnect_streams, net_log); 188 num_preconnect_streams, net_log);
185 return OK; 189 return OK;
186 } 190 }
187 191
188 return socket_handle->Init(connection_group, ssl_params, 192 return socket_handle->Init(connection_group, ssl_params,
189 request_info.priority, callback, ssl_pool, 193 request_priority, callback, ssl_pool,
190 net_log); 194 net_log);
191 } 195 }
192 196
193 // Finally, get the connection started. 197 // Finally, get the connection started.
194 if (proxy_info.is_http() || proxy_info.is_https()) { 198 if (proxy_info.is_http() || proxy_info.is_https()) {
195 HttpProxyClientSocketPool* pool = 199 HttpProxyClientSocketPool* pool =
196 session->GetSocketPoolForHTTPProxy(*proxy_host_port); 200 session->GetSocketPoolForHTTPProxy(*proxy_host_port);
197 if (num_preconnect_streams) { 201 if (num_preconnect_streams) {
198 RequestSocketsForPool(pool, connection_group, http_proxy_params, 202 RequestSocketsForPool(pool, connection_group, http_proxy_params,
199 num_preconnect_streams, net_log); 203 num_preconnect_streams, net_log);
200 return OK; 204 return OK;
201 } 205 }
202 206
203 return socket_handle->Init(connection_group, http_proxy_params, 207 return socket_handle->Init(connection_group, http_proxy_params,
204 request_info.priority, callback, 208 request_priority, callback,
205 pool, net_log); 209 pool, net_log);
206 } 210 }
207 211
208 if (proxy_info.is_socks()) { 212 if (proxy_info.is_socks()) {
209 SOCKSClientSocketPool* pool = 213 SOCKSClientSocketPool* pool =
210 session->GetSocketPoolForSOCKSProxy(*proxy_host_port); 214 session->GetSocketPoolForSOCKSProxy(*proxy_host_port);
211 if (num_preconnect_streams) { 215 if (num_preconnect_streams) {
212 RequestSocketsForPool(pool, connection_group, socks_params, 216 RequestSocketsForPool(pool, connection_group, socks_params,
213 num_preconnect_streams, net_log); 217 num_preconnect_streams, net_log);
214 return OK; 218 return OK;
215 } 219 }
216 220
217 return socket_handle->Init(connection_group, socks_params, 221 return socket_handle->Init(connection_group, socks_params,
218 request_info.priority, callback, pool, 222 request_priority, callback, pool,
219 net_log); 223 net_log);
220 } 224 }
221 225
222 DCHECK(proxy_info.is_direct()); 226 DCHECK(proxy_info.is_direct());
223 227
224 TransportClientSocketPool* pool = session->transport_socket_pool(); 228 TransportClientSocketPool* pool = session->transport_socket_pool();
225 if (num_preconnect_streams) { 229 if (num_preconnect_streams) {
226 RequestSocketsForPool(pool, connection_group, tcp_params, 230 RequestSocketsForPool(pool, connection_group, tcp_params,
227 num_preconnect_streams, net_log); 231 num_preconnect_streams, net_log);
228 return OK; 232 return OK;
229 } 233 }
230 234
231 return socket_handle->Init(connection_group, tcp_params, 235 return socket_handle->Init(connection_group, tcp_params,
232 request_info.priority, callback, 236 request_priority, callback,
233 pool, net_log); 237 pool, net_log);
234 } 238 }
235 239
236 } // namespace 240 } // namespace
237 241
238 ClientSocketPoolManager::ClientSocketPoolManager( 242 ClientSocketPoolManager::ClientSocketPoolManager(
239 NetLog* net_log, 243 NetLog* net_log,
240 ClientSocketFactory* socket_factory, 244 ClientSocketFactory* socket_factory,
241 HostResolver* host_resolver, 245 HostResolver* host_resolver,
242 CertVerifier* cert_verifier, 246 CertVerifier* cert_verifier,
(...skipping 351 matching lines...) Expand 10 before | Expand all | Expand 10 after
594 // cert. 598 // cert.
595 // 599 //
596 // Since the OnCertTrustChanged method doesn't tell us what 600 // Since the OnCertTrustChanged method doesn't tell us what
597 // kind of trust change it is, we have to flush the socket 601 // kind of trust change it is, we have to flush the socket
598 // pools to be safe. 602 // pools to be safe.
599 FlushSocketPools(); 603 FlushSocketPools();
600 } 604 }
601 605
602 // static 606 // static
603 int ClientSocketPoolManager::InitSocketHandleForHttpRequest( 607 int ClientSocketPoolManager::InitSocketHandleForHttpRequest(
604 const HttpRequestInfo& request_info, 608 const GURL& request_url,
609 const GURL& request_referrer,
610 const HttpRequestHeaders& request_extra_headers,
611 int request_load_flags,
612 RequestPriority request_priority,
605 HttpNetworkSession* session, 613 HttpNetworkSession* session,
606 const ProxyInfo& proxy_info, 614 const ProxyInfo& proxy_info,
607 bool force_spdy_over_ssl, 615 bool force_spdy_over_ssl,
608 bool want_spdy_over_npn, 616 bool want_spdy_over_npn,
609 const SSLConfig& ssl_config_for_origin, 617 const SSLConfig& ssl_config_for_origin,
610 const SSLConfig& ssl_config_for_proxy, 618 const SSLConfig& ssl_config_for_proxy,
611 const BoundNetLog& net_log, 619 const BoundNetLog& net_log,
612 ClientSocketHandle* socket_handle, 620 ClientSocketHandle* socket_handle,
613 CompletionCallback* callback) { 621 CompletionCallback* callback) {
614 DCHECK(socket_handle); 622 DCHECK(socket_handle);
615 return InitSocketPoolHelper(request_info, 623 return InitSocketPoolHelper(request_url,
624 request_referrer,
625 request_extra_headers,
626 request_load_flags,
627 request_priority,
616 session, 628 session,
617 proxy_info, 629 proxy_info,
618 force_spdy_over_ssl, 630 force_spdy_over_ssl,
619 want_spdy_over_npn, 631 want_spdy_over_npn,
620 ssl_config_for_origin, 632 ssl_config_for_origin,
621 ssl_config_for_proxy, 633 ssl_config_for_proxy,
622 false, 634 false,
623 net_log, 635 net_log,
624 0, 636 0,
625 socket_handle, 637 socket_handle,
626 callback); 638 callback);
627 } 639 }
628 640
629 // static 641 // static
630 int ClientSocketPoolManager::InitSocketHandleForRawConnect( 642 int ClientSocketPoolManager::InitSocketHandleForRawConnect(
631 const HostPortPair& host_port_pair, 643 const HostPortPair& host_port_pair,
632 HttpNetworkSession* session, 644 HttpNetworkSession* session,
633 const ProxyInfo& proxy_info, 645 const ProxyInfo& proxy_info,
634 const SSLConfig& ssl_config_for_origin, 646 const SSLConfig& ssl_config_for_origin,
635 const SSLConfig& ssl_config_for_proxy, 647 const SSLConfig& ssl_config_for_proxy,
636 const BoundNetLog& net_log, 648 const BoundNetLog& net_log,
637 ClientSocketHandle* socket_handle, 649 ClientSocketHandle* socket_handle,
638 CompletionCallback* callback) { 650 CompletionCallback* callback) {
639 DCHECK(socket_handle); 651 DCHECK(socket_handle);
640 // Synthesize an HttpRequestInfo. 652 // Synthesize an HttpRequestInfo.
641 HttpRequestInfo request_info; 653 GURL request_url = GURL("http://" + host_port_pair.ToString());
642 request_info.url = GURL("http://" + host_port_pair.ToString()); 654 GURL request_referrer;
643 return InitSocketPoolHelper(request_info, 655 HttpRequestHeaders request_extra_headers;
656 int request_load_flags = 0;
657 RequestPriority request_priority = MEDIUM;
658
659 return InitSocketPoolHelper(request_url,
660 request_referrer,
661 request_extra_headers,
662 request_load_flags,
663 request_priority,
644 session, 664 session,
645 proxy_info, 665 proxy_info,
646 false, 666 false,
647 false, 667 false,
648 ssl_config_for_origin, 668 ssl_config_for_origin,
649 ssl_config_for_proxy, 669 ssl_config_for_proxy,
650 true, 670 true,
651 net_log, 671 net_log,
652 0, 672 0,
653 socket_handle, 673 socket_handle,
654 callback); 674 callback);
655 } 675 }
656 676
657 // static 677 // static
658 int ClientSocketPoolManager::PreconnectSocketsForHttpRequest( 678 int ClientSocketPoolManager::PreconnectSocketsForHttpRequest(
659 const HttpRequestInfo& request_info, 679 const GURL& request_url,
680 const GURL& request_referrer,
681 const HttpRequestHeaders& request_extra_headers,
682 int request_load_flags,
683 RequestPriority request_priority,
660 HttpNetworkSession* session, 684 HttpNetworkSession* session,
661 const ProxyInfo& proxy_info, 685 const ProxyInfo& proxy_info,
662 bool force_spdy_over_ssl, 686 bool force_spdy_over_ssl,
663 bool want_spdy_over_npn, 687 bool want_spdy_over_npn,
664 const SSLConfig& ssl_config_for_origin, 688 const SSLConfig& ssl_config_for_origin,
665 const SSLConfig& ssl_config_for_proxy, 689 const SSLConfig& ssl_config_for_proxy,
666 const BoundNetLog& net_log, 690 const BoundNetLog& net_log,
667 int num_preconnect_streams) { 691 int num_preconnect_streams) {
668 return InitSocketPoolHelper(request_info, 692 return InitSocketPoolHelper(request_url,
693 request_referrer,
694 request_extra_headers,
695 request_load_flags,
696 request_priority,
669 session, 697 session,
670 proxy_info, 698 proxy_info,
671 force_spdy_over_ssl, 699 force_spdy_over_ssl,
672 want_spdy_over_npn, 700 want_spdy_over_npn,
673 ssl_config_for_origin, 701 ssl_config_for_origin,
674 ssl_config_for_proxy, 702 ssl_config_for_proxy,
675 false, 703 false,
676 net_log, 704 net_log,
677 num_preconnect_streams, 705 num_preconnect_streams,
678 NULL, 706 NULL,
679 NULL); 707 NULL);
680 } 708 }
681 709
682 710
683 } // namespace net 711 } // namespace net
OLDNEW
« no previous file with comments | « net/socket/client_socket_pool_manager.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698