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

Side by Side Diff: net/http/http_stream_factory_impl_job.h

Issue 2814633003: Extract Proxy Resolution out of HttpStreamFactoryImpl::Job (Closed)
Patch Set: fix remaining tests Created 3 years, 7 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
OLDNEW
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_HTTP_HTTP_STREAM_FACTORY_IMPL_JOB_H_ 5 #ifndef NET_HTTP_HTTP_STREAM_FACTORY_IMPL_JOB_H_
6 #define NET_HTTP_HTTP_STREAM_FACTORY_IMPL_JOB_H_ 6 #define NET_HTTP_HTTP_STREAM_FACTORY_IMPL_JOB_H_
7 7
8 #include <memory> 8 #include <memory>
9 #include <utility> 9 #include <utility>
10 10
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
95 virtual void OnNeedsProxyAuth(Job* job, 95 virtual void OnNeedsProxyAuth(Job* job,
96 const HttpResponseInfo& proxy_response, 96 const HttpResponseInfo& proxy_response,
97 const SSLConfig& used_ssl_config, 97 const SSLConfig& used_ssl_config,
98 const ProxyInfo& used_proxy_info, 98 const ProxyInfo& used_proxy_info,
99 HttpAuthController* auth_controller) = 0; 99 HttpAuthController* auth_controller) = 0;
100 100
101 // Returns true if the connection initialization to the proxy server 101 // Returns true if the connection initialization to the proxy server
102 // contained in |proxy_info| can be skipped. 102 // contained in |proxy_info| can be skipped.
103 virtual bool OnInitConnection(const ProxyInfo& proxy_info) = 0; 103 virtual bool OnInitConnection(const ProxyInfo& proxy_info) = 0;
104 104
105 // Invoked when |job| has completed proxy resolution. The delegate may
106 // create an alternative proxy server job to fetch the request.
107 virtual void OnResolveProxyComplete(
108 Job* job,
109 const HttpRequestInfo& request_info,
110 RequestPriority priority,
111 const SSLConfig& server_ssl_config,
112 const SSLConfig& proxy_ssl_config,
113 HttpStreamRequest::StreamType stream_type) = 0;
114
115 // Invoked to notify the Request and Factory of the readiness of new 105 // Invoked to notify the Request and Factory of the readiness of new
116 // SPDY session. 106 // SPDY session.
117 virtual void OnNewSpdySessionReady( 107 virtual void OnNewSpdySessionReady(
118 Job* job, 108 Job* job,
119 const base::WeakPtr<SpdySession>& spdy_session, 109 const base::WeakPtr<SpdySession>& spdy_session,
120 bool direct) = 0; 110 bool direct) = 0;
121 111
122 // Invoked when the |job| finishes pre-connecting sockets. 112 // Invoked when the |job| finishes pre-connecting sockets.
123 virtual void OnPreconnectsComplete(Job* job) = 0; 113 virtual void OnPreconnectsComplete(Job* job) = 0;
124 114
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
156 }; 146 };
157 147
158 // Constructor for non-alternative Job. 148 // Constructor for non-alternative Job.
159 // Job is owned by |delegate|, hence |delegate| is valid for the 149 // Job is owned by |delegate|, hence |delegate| is valid for the
160 // lifetime of the Job. 150 // lifetime of the Job.
161 Job(Delegate* delegate, 151 Job(Delegate* delegate,
162 JobType job_type, 152 JobType job_type,
163 HttpNetworkSession* session, 153 HttpNetworkSession* session,
164 const HttpRequestInfo& request_info, 154 const HttpRequestInfo& request_info,
165 RequestPriority priority, 155 RequestPriority priority,
156 ProxyInfo proxy_info,
166 const SSLConfig& server_ssl_config, 157 const SSLConfig& server_ssl_config,
167 const SSLConfig& proxy_ssl_config, 158 const SSLConfig& proxy_ssl_config,
168 HostPortPair destination, 159 HostPortPair destination,
169 GURL origin_url, 160 GURL origin_url,
170 bool enable_ip_based_pooling, 161 bool enable_ip_based_pooling,
171 NetLog* net_log); 162 NetLog* net_log);
172 163
173 // Constructor for the alternative Job. The Job is owned by |delegate|, hence 164 // Constructor for the alternative Job. The Job is owned by |delegate|, hence
174 // |delegate| is valid for the lifetime of the Job. If |alternative_service| 165 // |delegate| is valid for the lifetime of the Job. If |alternative_service|
175 // is initialized, then the Job will use the alternative service. On the 166 // is initialized, then the Job will use the alternative service. On the
176 // other hand, if |alternative_proxy_server| is a valid proxy server, then the 167 // other hand, if |alternative_proxy_server| is a valid proxy server, then the
177 // job will use that instead of using ProxyService for proxy resolution. 168 // job will use that instead of using ProxyService for proxy resolution.
178 // Further, if |alternative_proxy_server| is a valid but bad proxy, then 169 // Further, if |alternative_proxy_server| is a valid but bad proxy, then
179 // fallback proxies are not used. It is illegal to call this with an 170 // fallback proxies are not used. It is illegal to call this with an
180 // initialized |alternative_service|, and a valid |alternative_proxy_server|. 171 // initialized |alternative_service|, and a valid |alternative_proxy_server|.
181 Job(Delegate* delegate, 172 Job(Delegate* delegate,
182 JobType job_type, 173 JobType job_type,
183 HttpNetworkSession* session, 174 HttpNetworkSession* session,
184 const HttpRequestInfo& request_info, 175 const HttpRequestInfo& request_info,
185 RequestPriority priority, 176 RequestPriority priority,
177 ProxyInfo proxy_info,
186 const SSLConfig& server_ssl_config, 178 const SSLConfig& server_ssl_config,
187 const SSLConfig& proxy_ssl_config, 179 const SSLConfig& proxy_ssl_config,
188 HostPortPair destination, 180 HostPortPair destination,
189 GURL origin_url, 181 GURL origin_url,
190 AlternativeService alternative_service, 182 AlternativeService alternative_service,
191 const ProxyServer& alternative_proxy_server, 183 const ProxyServer& alternative_proxy_server,
192 bool enable_ip_based_pooling, 184 bool enable_ip_based_pooling,
193 NetLog* net_log); 185 NetLog* net_log);
194 virtual ~Job(); 186 virtual ~Job();
195 187
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
244 } 236 }
245 237
246 const ProxyServer alternative_proxy_server() const { 238 const ProxyServer alternative_proxy_server() const {
247 return alternative_proxy_server_; 239 return alternative_proxy_server_;
248 } 240 }
249 241
250 bool using_existing_quic_session() const { 242 bool using_existing_quic_session() const {
251 return using_existing_quic_session_; 243 return using_existing_quic_session_;
252 } 244 }
253 245
246 bool reconsider_proxy() const { return reconsider_proxy_; }
247
254 // TODO(xunjieli): Added to investigate crbug.com/711721. Remove when no 248 // TODO(xunjieli): Added to investigate crbug.com/711721. Remove when no
255 // longer needed. 249 // longer needed.
256 void LogHistograms() const; 250 void LogHistograms() const;
257 251
258 private: 252 private:
259 friend class HttpStreamFactoryImplJobPeer; 253 friend class HttpStreamFactoryImplJobPeer;
260 254
261 enum State { 255 enum State {
262 STATE_START, 256 STATE_START,
263 STATE_RESOLVE_PROXY,
264 STATE_RESOLVE_PROXY_COMPLETE,
265
266 // The main and alternative jobs are started in parallel. The main job 257 // The main and alternative jobs are started in parallel. The main job
267 // waits after it finishes proxy resolution. The alternative job never 258 // waits after it finishes proxy resolution. The alternative job never
268 // waits. 259 // waits.
269 // 260 //
270 // An HTTP/2 alternative job notifies the JobController in DoInitConnection 261 // An HTTP/2 alternative job notifies the JobController in DoInitConnection
271 // unless it can pool to an existing SpdySession. JobController, in turn, 262 // unless it can pool to an existing SpdySession. JobController, in turn,
272 // resumes the main job. 263 // resumes the main job.
273 // 264 //
274 // A QUIC alternative job notifies the JobController in DoInitConnection 265 // A QUIC alternative job notifies the JobController in DoInitConnection
275 // regardless of whether it pools to an existing QUIC session, but the main 266 // regardless of whether it pools to an existing QUIC session, but the main
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
314 void RunLoop(int result); 305 void RunLoop(int result);
315 int DoLoop(int result); 306 int DoLoop(int result);
316 int StartInternal(); 307 int StartInternal();
317 int DoInitConnectionImpl(); 308 int DoInitConnectionImpl();
318 309
319 // Each of these methods corresponds to a State value. Those with an input 310 // Each of these methods corresponds to a State value. Those with an input
320 // argument receive the result from the previous state. If a method returns 311 // argument receive the result from the previous state. If a method returns
321 // ERR_IO_PENDING, then the result from OnIOComplete will be passed to the 312 // ERR_IO_PENDING, then the result from OnIOComplete will be passed to the
322 // next state method as the result arg. 313 // next state method as the result arg.
323 int DoStart(); 314 int DoStart();
324 int DoResolveProxy();
325 int DoResolveProxyComplete(int result);
326 int DoWait(); 315 int DoWait();
327 int DoWaitComplete(int result); 316 int DoWaitComplete(int result);
328 int DoInitConnection(); 317 int DoInitConnection();
329 int DoInitConnectionComplete(int result); 318 int DoInitConnectionComplete(int result);
330 int DoWaitingUserAction(int result); 319 int DoWaitingUserAction(int result);
331 int DoCreateStream(); 320 int DoCreateStream();
332 int DoCreateStreamComplete(int result); 321 int DoCreateStreamComplete(int result);
333 int DoRestartTunnelAuth(); 322 int DoRestartTunnelAuth();
334 int DoRestartTunnelAuthComplete(int result); 323 int DoRestartTunnelAuthComplete(int result);
335 324
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
398 // session is found, and OK otherwise. 387 // session is found, and OK otherwise.
399 static int OnHostResolution(SpdySessionPool* spdy_session_pool, 388 static int OnHostResolution(SpdySessionPool* spdy_session_pool,
400 const SpdySessionKey& spdy_session_key, 389 const SpdySessionKey& spdy_session_key,
401 const GURL& origin_url, 390 const GURL& origin_url,
402 bool enable_ip_based_pooling, 391 bool enable_ip_based_pooling,
403 const AddressList& addresses, 392 const AddressList& addresses,
404 const NetLogWithSource& net_log); 393 const NetLogWithSource& net_log);
405 394
406 const HttpRequestInfo request_info_; 395 const HttpRequestInfo request_info_;
407 RequestPriority priority_; 396 RequestPriority priority_;
408 ProxyInfo proxy_info_; 397 const ProxyInfo proxy_info_;
409 SSLConfig server_ssl_config_; 398 SSLConfig server_ssl_config_;
410 SSLConfig proxy_ssl_config_; 399 SSLConfig proxy_ssl_config_;
411 const NetLogWithSource net_log_; 400 const NetLogWithSource net_log_;
412 401
413 CompletionCallback io_callback_; 402 CompletionCallback io_callback_;
414 std::unique_ptr<ClientSocketHandle> connection_; 403 std::unique_ptr<ClientSocketHandle> connection_;
415 HttpNetworkSession* const session_; 404 HttpNetworkSession* const session_;
416 405
417 // |state_| is only used for LogHistograms(). 406 // |state_| is only used for LogHistograms().
418 State state_; 407 State state_;
419 408
420 State next_state_; 409 State next_state_;
421 ProxyService::PacRequest* pac_request_;
422 SSLInfo ssl_info_; 410 SSLInfo ssl_info_;
423 411
424 // The server we are trying to reach, could be that of the origin or of the 412 // The server we are trying to reach, could be that of the origin or of the
425 // alternative service (after applying host mapping rules). 413 // alternative service (after applying host mapping rules).
426 const HostPortPair destination_; 414 const HostPortPair destination_;
427 415
428 // The origin url we're trying to reach. This url may be different from the 416 // The origin url we're trying to reach. This url may be different from the
429 // original request when host mapping rules are set-up. 417 // original request when host mapping rules are set-up.
430 const GURL origin_url_; 418 const GURL origin_url_;
431 419
(...skipping 14 matching lines...) Expand all
446 const JobType job_type_; 434 const JobType job_type_;
447 435
448 // True if handling a HTTPS request. 436 // True if handling a HTTPS request.
449 const bool using_ssl_; 437 const bool using_ssl_;
450 438
451 // True if this network transaction is using SPDY instead of HTTP. 439 // True if this network transaction is using SPDY instead of HTTP.
452 bool using_spdy_; 440 bool using_spdy_;
453 441
454 // True if this network transaction is using QUIC instead of HTTP. 442 // True if this network transaction is using QUIC instead of HTTP.
455 bool using_quic_; 443 bool using_quic_;
456 QuicStreamRequest quic_request_; 444
445 // True if this job might succeed with a different proxy config.
446 bool reconsider_proxy_;
447
448 // TODO(xunjieli): Create only if Quic is to be used.
449 std::unique_ptr<QuicStreamRequest> quic_request_;
457 450
458 // True if this job used an existing QUIC session. 451 // True if this job used an existing QUIC session.
459 bool using_existing_quic_session_; 452 bool using_existing_quic_session_;
460 453
461 // True when the tunnel is in the process of being established - we can't 454 // True when the tunnel is in the process of being established - we can't
462 // read from the socket until the tunnel is done. 455 // read from the socket until the tunnel is done.
463 bool establishing_tunnel_; 456 bool establishing_tunnel_;
464 457
465 std::unique_ptr<HttpStream> stream_; 458 std::unique_ptr<HttpStream> stream_;
466 std::unique_ptr<WebSocketHandshakeStreamBase> websocket_stream_; 459 std::unique_ptr<WebSocketHandshakeStreamBase> websocket_stream_;
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
500 public: 493 public:
501 virtual ~JobFactory() {} 494 virtual ~JobFactory() {}
502 495
503 // Creates an alternative service Job. 496 // Creates an alternative service Job.
504 virtual HttpStreamFactoryImpl::Job* CreateJob( 497 virtual HttpStreamFactoryImpl::Job* CreateJob(
505 HttpStreamFactoryImpl::Job::Delegate* delegate, 498 HttpStreamFactoryImpl::Job::Delegate* delegate,
506 HttpStreamFactoryImpl::JobType job_type, 499 HttpStreamFactoryImpl::JobType job_type,
507 HttpNetworkSession* session, 500 HttpNetworkSession* session,
508 const HttpRequestInfo& request_info, 501 const HttpRequestInfo& request_info,
509 RequestPriority priority, 502 RequestPriority priority,
503 ProxyInfo proxy_info,
510 const SSLConfig& server_ssl_config, 504 const SSLConfig& server_ssl_config,
511 const SSLConfig& proxy_ssl_config, 505 const SSLConfig& proxy_ssl_config,
512 HostPortPair destination, 506 HostPortPair destination,
513 GURL origin_url, 507 GURL origin_url,
514 AlternativeService alternative_service, 508 AlternativeService alternative_service,
515 bool enable_ip_based_pooling, 509 bool enable_ip_based_pooling,
516 NetLog* net_log) = 0; 510 NetLog* net_log) = 0;
517 511
518 // Creates an alternative proxy server Job. 512 // Creates an alternative proxy server Job.
519 virtual HttpStreamFactoryImpl::Job* CreateJob( 513 virtual HttpStreamFactoryImpl::Job* CreateJob(
520 HttpStreamFactoryImpl::Job::Delegate* delegate, 514 HttpStreamFactoryImpl::Job::Delegate* delegate,
521 HttpStreamFactoryImpl::JobType job_type, 515 HttpStreamFactoryImpl::JobType job_type,
522 HttpNetworkSession* session, 516 HttpNetworkSession* session,
523 const HttpRequestInfo& request_info, 517 const HttpRequestInfo& request_info,
524 RequestPriority priority, 518 RequestPriority priority,
519 ProxyInfo proxy_info,
525 const SSLConfig& server_ssl_config, 520 const SSLConfig& server_ssl_config,
526 const SSLConfig& proxy_ssl_config, 521 const SSLConfig& proxy_ssl_config,
527 HostPortPair destination, 522 HostPortPair destination,
528 GURL origin_url, 523 GURL origin_url,
529 const ProxyServer& alternative_proxy_server, 524 const ProxyServer& alternative_proxy_server,
530 bool enable_ip_based_pooling, 525 bool enable_ip_based_pooling,
531 NetLog* net_log) = 0; 526 NetLog* net_log) = 0;
532 527
533 // Creates a non-alternative Job. 528 // Creates a non-alternative Job.
534 virtual HttpStreamFactoryImpl::Job* CreateJob( 529 virtual HttpStreamFactoryImpl::Job* CreateJob(
535 HttpStreamFactoryImpl::Job::Delegate* delegate, 530 HttpStreamFactoryImpl::Job::Delegate* delegate,
536 HttpStreamFactoryImpl::JobType job_type, 531 HttpStreamFactoryImpl::JobType job_type,
537 HttpNetworkSession* session, 532 HttpNetworkSession* session,
538 const HttpRequestInfo& request_info, 533 const HttpRequestInfo& request_info,
539 RequestPriority priority, 534 RequestPriority priority,
535 ProxyInfo proxy_info,
540 const SSLConfig& server_ssl_config, 536 const SSLConfig& server_ssl_config,
541 const SSLConfig& proxy_ssl_config, 537 const SSLConfig& proxy_ssl_config,
542 HostPortPair destination, 538 HostPortPair destination,
543 GURL origin_url, 539 GURL origin_url,
544 bool enable_ip_based_pooling, 540 bool enable_ip_based_pooling,
545 NetLog* net_log) = 0; 541 NetLog* net_log) = 0;
546 }; 542 };
547 543
548 } // namespace net 544 } // namespace net
549 545
550 #endif // NET_HTTP_HTTP_STREAM_FACTORY_IMPL_JOB_H_ 546 #endif // NET_HTTP_HTTP_STREAM_FACTORY_IMPL_JOB_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698