Chromium Code Reviews| 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_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 Loading... | |
| 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 Loading... | |
| 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 const 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 const 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 Loading... | |
| 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 should_reconsider_proxy() const { return should_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 |
|
Zhongyi Shi
2017/05/10 20:28:15
Could you also update the comments since the proxy
xunjieli
2017/05/10 23:24:41
Done. Good point!
| |
| 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 |
| 276 // job is only resumed after some delay. | 267 // job is only resumed after some delay. |
| 277 // | 268 // |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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_; |
| 444 | |
| 445 // True if this job might succeed with a different proxy config. | |
| 446 bool should_reconsider_proxy_; | |
| 447 | |
| 456 QuicStreamRequest quic_request_; | 448 QuicStreamRequest quic_request_; |
| 457 | 449 |
| 458 // True if this job used an existing QUIC session. | 450 // True if this job used an existing QUIC session. |
| 459 bool using_existing_quic_session_; | 451 bool using_existing_quic_session_; |
| 460 | 452 |
| 461 // True when the tunnel is in the process of being established - we can't | 453 // True when the tunnel is in the process of being established - we can't |
| 462 // read from the socket until the tunnel is done. | 454 // read from the socket until the tunnel is done. |
| 463 bool establishing_tunnel_; | 455 bool establishing_tunnel_; |
| 464 | 456 |
| 465 std::unique_ptr<HttpStream> stream_; | 457 std::unique_ptr<HttpStream> stream_; |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 491 HttpStreamRequest::StreamType stream_type_; | 483 HttpStreamRequest::StreamType stream_type_; |
| 492 | 484 |
| 493 base::WeakPtrFactory<Job> ptr_factory_; | 485 base::WeakPtrFactory<Job> ptr_factory_; |
| 494 | 486 |
| 495 DISALLOW_COPY_AND_ASSIGN(Job); | 487 DISALLOW_COPY_AND_ASSIGN(Job); |
| 496 }; | 488 }; |
| 497 | 489 |
| 498 // Factory for creating Jobs. | 490 // Factory for creating Jobs. |
| 499 class HttpStreamFactoryImpl::JobFactory { | 491 class HttpStreamFactoryImpl::JobFactory { |
| 500 public: | 492 public: |
| 501 virtual ~JobFactory() {} | 493 JobFactory(); |
| 502 | 494 |
| 503 // Creates an alternative service Job. | 495 virtual ~JobFactory(); |
| 504 virtual HttpStreamFactoryImpl::Job* CreateJob( | 496 |
| 497 virtual HttpStreamFactoryImpl::Job* CreateMainJob( | |
| 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, | |
|
tbansal1
2017/05/10 21:53:20
pass as const ref. Same for other ctors below.
xunjieli
2017/05/10 23:24:41
Done. Good point!
| |
| 504 const SSLConfig& server_ssl_config, | |
| 505 const SSLConfig& proxy_ssl_config, | |
| 506 HostPortPair destination, | |
| 507 GURL origin_url, | |
| 508 bool enable_ip_based_pooling, | |
| 509 NetLog* net_log); | |
| 510 | |
| 511 virtual HttpStreamFactoryImpl::Job* CreateAltJob( | |
|
Zhongyi Shi
2017/05/10 20:28:15
optional nit: how about CreateAltSvcJob?
xunjieli
2017/05/10 23:24:41
Done.
| |
| 512 HttpStreamFactoryImpl::Job::Delegate* delegate, | |
| 513 HttpStreamFactoryImpl::JobType job_type, | |
| 514 HttpNetworkSession* session, | |
| 515 const HttpRequestInfo& request_info, | |
| 516 RequestPriority priority, | |
| 517 ProxyInfo proxy_info, | |
| 510 const SSLConfig& server_ssl_config, | 518 const SSLConfig& server_ssl_config, |
| 511 const SSLConfig& proxy_ssl_config, | 519 const SSLConfig& proxy_ssl_config, |
| 512 HostPortPair destination, | 520 HostPortPair destination, |
| 513 GURL origin_url, | 521 GURL origin_url, |
| 514 AlternativeService alternative_service, | 522 AlternativeService alternative_service, |
| 515 bool enable_ip_based_pooling, | 523 bool enable_ip_based_pooling, |
| 516 NetLog* net_log) = 0; | 524 NetLog* net_log); |
| 517 | 525 |
| 518 // Creates an alternative proxy server Job. | 526 virtual HttpStreamFactoryImpl::Job* CreateAltProxyJob( |
| 519 virtual HttpStreamFactoryImpl::Job* CreateJob( | |
| 520 HttpStreamFactoryImpl::Job::Delegate* delegate, | 527 HttpStreamFactoryImpl::Job::Delegate* delegate, |
| 521 HttpStreamFactoryImpl::JobType job_type, | 528 HttpStreamFactoryImpl::JobType job_type, |
| 522 HttpNetworkSession* session, | 529 HttpNetworkSession* session, |
| 523 const HttpRequestInfo& request_info, | 530 const HttpRequestInfo& request_info, |
| 524 RequestPriority priority, | 531 RequestPriority priority, |
| 532 ProxyInfo proxy_info, | |
| 525 const SSLConfig& server_ssl_config, | 533 const SSLConfig& server_ssl_config, |
| 526 const SSLConfig& proxy_ssl_config, | 534 const SSLConfig& proxy_ssl_config, |
| 527 HostPortPair destination, | 535 HostPortPair destination, |
| 528 GURL origin_url, | 536 GURL origin_url, |
| 529 const ProxyServer& alternative_proxy_server, | 537 const ProxyServer& alternative_proxy_server, |
| 530 bool enable_ip_based_pooling, | 538 bool enable_ip_based_pooling, |
| 531 NetLog* net_log) = 0; | 539 NetLog* net_log); |
| 532 | |
| 533 // Creates a non-alternative Job. | |
| 534 virtual HttpStreamFactoryImpl::Job* CreateJob( | |
| 535 HttpStreamFactoryImpl::Job::Delegate* delegate, | |
| 536 HttpStreamFactoryImpl::JobType job_type, | |
| 537 HttpNetworkSession* session, | |
| 538 const HttpRequestInfo& request_info, | |
| 539 RequestPriority priority, | |
| 540 const SSLConfig& server_ssl_config, | |
| 541 const SSLConfig& proxy_ssl_config, | |
| 542 HostPortPair destination, | |
| 543 GURL origin_url, | |
| 544 bool enable_ip_based_pooling, | |
| 545 NetLog* net_log) = 0; | |
| 546 }; | 540 }; |
| 547 | 541 |
| 548 } // namespace net | 542 } // namespace net |
| 549 | 543 |
| 550 #endif // NET_HTTP_HTTP_STREAM_FACTORY_IMPL_JOB_H_ | 544 #endif // NET_HTTP_HTTP_STREAM_FACTORY_IMPL_JOB_H_ |
| OLD | NEW |