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

Side by Side Diff: net/proxy/proxy_service.cc

Issue 8985012: base::Bind: Convert net/proxy. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Add bind includes. Created 9 years 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
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 #include "net/proxy/proxy_service.h" 5 #include "net/proxy/proxy_service.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/bind_helpers.h" 10 #include "base/bind_helpers.h"
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
101 *config = ProxyConfig::CreateDirect(); 101 *config = ProxyConfig::CreateDirect();
102 return CONFIG_VALID; 102 return CONFIG_VALID;
103 } 103 }
104 }; 104 };
105 105
106 // Proxy resolver that fails every time. 106 // Proxy resolver that fails every time.
107 class ProxyResolverNull : public ProxyResolver { 107 class ProxyResolverNull : public ProxyResolver {
108 public: 108 public:
109 ProxyResolverNull() : ProxyResolver(false /*expects_pac_bytes*/) {} 109 ProxyResolverNull() : ProxyResolver(false /*expects_pac_bytes*/) {}
110 110
111 // ProxyResolver implementation: 111 // ProxyResolver implementation.
112 virtual int GetProxyForURL(const GURL& url, 112 virtual int GetProxyForURL(const GURL& url,
113 ProxyInfo* results, 113 ProxyInfo* results,
114 OldCompletionCallback* callback, 114 const CompletionCallback& callback,
115 RequestHandle* request, 115 RequestHandle* request,
116 const BoundNetLog& net_log) OVERRIDE { 116 const BoundNetLog& net_log) OVERRIDE {
117 return ERR_NOT_IMPLEMENTED; 117 return ERR_NOT_IMPLEMENTED;
118 } 118 }
119 119
120 virtual void CancelRequest(RequestHandle request) OVERRIDE { 120 virtual void CancelRequest(RequestHandle request) OVERRIDE {
121 NOTREACHED(); 121 NOTREACHED();
122 } 122 }
123 123
124 virtual LoadState GetLoadState(RequestHandle request) const OVERRIDE { 124 virtual LoadState GetLoadState(RequestHandle request) const OVERRIDE {
125 NOTREACHED(); 125 NOTREACHED();
126 return LOAD_STATE_IDLE; 126 return LOAD_STATE_IDLE;
127 } 127 }
128 128
129 virtual LoadState GetLoadStateThreadSafe( 129 virtual LoadState GetLoadStateThreadSafe(
130 RequestHandle request) const OVERRIDE { 130 RequestHandle request) const OVERRIDE {
131 NOTREACHED(); 131 NOTREACHED();
132 return LOAD_STATE_IDLE; 132 return LOAD_STATE_IDLE;
133 } 133 }
134 134
135 virtual void CancelSetPacScript() OVERRIDE { 135 virtual void CancelSetPacScript() OVERRIDE {
136 NOTREACHED(); 136 NOTREACHED();
137 } 137 }
138 138
139 virtual int SetPacScript( 139 virtual int SetPacScript(
140 const scoped_refptr<ProxyResolverScriptData>& /*script_data*/, 140 const scoped_refptr<ProxyResolverScriptData>& /*script_data*/,
141 OldCompletionCallback* /*callback*/) OVERRIDE { 141 const CompletionCallback& /*callback*/) OVERRIDE {
142 return ERR_NOT_IMPLEMENTED; 142 return ERR_NOT_IMPLEMENTED;
143 } 143 }
144 }; 144 };
145 145
146 // ProxyResolver that simulates a PAC script which returns 146 // ProxyResolver that simulates a PAC script which returns
147 // |pac_string| for every single URL. 147 // |pac_string| for every single URL.
148 class ProxyResolverFromPacString : public ProxyResolver { 148 class ProxyResolverFromPacString : public ProxyResolver {
149 public: 149 public:
150 ProxyResolverFromPacString(const std::string& pac_string) 150 ProxyResolverFromPacString(const std::string& pac_string)
151 : ProxyResolver(false /*expects_pac_bytes*/), 151 : ProxyResolver(false /*expects_pac_bytes*/),
152 pac_string_(pac_string) {} 152 pac_string_(pac_string) {}
153 153
154 virtual int GetProxyForURL(const GURL& url, 154 virtual int GetProxyForURL(const GURL& url,
155 ProxyInfo* results, 155 ProxyInfo* results,
156 OldCompletionCallback* callback, 156 const CompletionCallback& callback,
157 RequestHandle* request, 157 RequestHandle* request,
158 const BoundNetLog& net_log) OVERRIDE { 158 const BoundNetLog& net_log) OVERRIDE {
159 results->UsePacString(pac_string_); 159 results->UsePacString(pac_string_);
160 return OK; 160 return OK;
161 } 161 }
162 162
163 virtual void CancelRequest(RequestHandle request) OVERRIDE { 163 virtual void CancelRequest(RequestHandle request) OVERRIDE {
164 NOTREACHED(); 164 NOTREACHED();
165 } 165 }
166 166
167 virtual LoadState GetLoadState(RequestHandle request) const OVERRIDE { 167 virtual LoadState GetLoadState(RequestHandle request) const OVERRIDE {
168 NOTREACHED(); 168 NOTREACHED();
169 return LOAD_STATE_IDLE; 169 return LOAD_STATE_IDLE;
170 } 170 }
171 171
172 virtual LoadState GetLoadStateThreadSafe( 172 virtual LoadState GetLoadStateThreadSafe(
173 RequestHandle request) const OVERRIDE { 173 RequestHandle request) const OVERRIDE {
174 NOTREACHED(); 174 NOTREACHED();
175 return LOAD_STATE_IDLE; 175 return LOAD_STATE_IDLE;
176 } 176 }
177 177
178 virtual void CancelSetPacScript() OVERRIDE { 178 virtual void CancelSetPacScript() OVERRIDE {
179 NOTREACHED(); 179 NOTREACHED();
180 } 180 }
181 181
182 virtual int SetPacScript( 182 virtual int SetPacScript(
183 const scoped_refptr<ProxyResolverScriptData>& pac_script, 183 const scoped_refptr<ProxyResolverScriptData>& pac_script,
184 OldCompletionCallback* callback) OVERRIDE { 184 const CompletionCallback& callback) OVERRIDE {
185 return OK; 185 return OK;
186 } 186 }
187 187
188 private: 188 private:
189 const std::string pac_string_; 189 const std::string pac_string_;
190 }; 190 };
191 191
192 // This factory creates V8ProxyResolvers with appropriate javascript bindings. 192 // This factory creates V8ProxyResolvers with appropriate javascript bindings.
193 class ProxyResolverFactoryForV8 : public ProxyResolverFactory { 193 class ProxyResolverFactoryForV8 : public ProxyResolverFactory {
194 public: 194 public:
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
327 // things similar. It will probably end up changing while solving bug 90581. 327 // things similar. It will probably end up changing while solving bug 90581.
328 328
329 class ProxyService::InitProxyResolver { 329 class ProxyService::InitProxyResolver {
330 public: 330 public:
331 InitProxyResolver(ProxyResolver* proxy_resolver, 331 InitProxyResolver(ProxyResolver* proxy_resolver,
332 ProxyScriptFetcher* proxy_script_fetcher, 332 ProxyScriptFetcher* proxy_script_fetcher,
333 DhcpProxyScriptFetcher* dhcp_proxy_script_fetcher, 333 DhcpProxyScriptFetcher* dhcp_proxy_script_fetcher,
334 NetLog* net_log) 334 NetLog* net_log)
335 : decider_(proxy_script_fetcher, dhcp_proxy_script_fetcher, net_log), 335 : decider_(proxy_script_fetcher, dhcp_proxy_script_fetcher, net_log),
336 effective_config_(NULL), 336 effective_config_(NULL),
337 proxy_resolver_(proxy_resolver), 337 proxy_resolver_(proxy_resolver) {
338 user_callback_(NULL),
339 ALLOW_THIS_IN_INITIALIZER_LIST(io_callback_(
340 this, &InitProxyResolver::OnIOCompletion)) {
341 } 338 }
342 339
343 ~InitProxyResolver() { 340 ~InitProxyResolver() {
344 // Note that the destruction of ProxyScriptDecider will automatically cancel 341 // Note that the destruction of ProxyScriptDecider will automatically cancel
345 // any outstanding work. 342 // any outstanding work.
346 if (next_state_ == STATE_SET_PAC_SCRIPT_COMPLETE) { 343 if (next_state_ == STATE_SET_PAC_SCRIPT_COMPLETE) {
347 proxy_resolver_->CancelSetPacScript(); 344 proxy_resolver_->CancelSetPacScript();
348 } 345 }
349 } 346 }
350 347
351 int Init(const ProxyConfig& config, 348 int Init(const ProxyConfig& config,
352 base::TimeDelta wait_delay, 349 base::TimeDelta wait_delay,
353 ProxyConfig* effective_config, 350 ProxyConfig* effective_config,
354 OldCompletionCallback* callback) { 351 const CompletionCallback& callback) {
355 config_ = config; 352 config_ = config;
356 wait_delay_ = wait_delay; 353 wait_delay_ = wait_delay;
357 effective_config_ = effective_config; 354 effective_config_ = effective_config;
358 user_callback_ = callback; 355 callback_ = callback;
359 356
360 next_state_ = STATE_DECIDE_PROXY_SCRIPT; 357 next_state_ = STATE_DECIDE_PROXY_SCRIPT;
361 return DoLoop(OK); 358 return DoLoop(OK);
362 } 359 }
363 360
364 private: 361 private:
365 enum State { 362 enum State {
366 STATE_NONE, 363 STATE_NONE,
367 STATE_DECIDE_PROXY_SCRIPT, 364 STATE_DECIDE_PROXY_SCRIPT,
368 STATE_DECIDE_PROXY_SCRIPT_COMPLETE, 365 STATE_DECIDE_PROXY_SCRIPT_COMPLETE,
(...skipping 29 matching lines...) Expand all
398 } 395 }
399 } while (rv != ERR_IO_PENDING && next_state_ != STATE_NONE); 396 } while (rv != ERR_IO_PENDING && next_state_ != STATE_NONE);
400 return rv; 397 return rv;
401 } 398 }
402 399
403 int DoDecideProxyScript() { 400 int DoDecideProxyScript() {
404 next_state_ = STATE_DECIDE_PROXY_SCRIPT_COMPLETE; 401 next_state_ = STATE_DECIDE_PROXY_SCRIPT_COMPLETE;
405 402
406 return decider_.Start( 403 return decider_.Start(
407 config_, wait_delay_, proxy_resolver_->expects_pac_bytes(), 404 config_, wait_delay_, proxy_resolver_->expects_pac_bytes(),
408 &io_callback_); 405 base::Bind(&InitProxyResolver::OnIOCompletion, base::Unretained(this)));
409 } 406 }
410 407
411 int DoDecideProxyScriptComplete(int result) { 408 int DoDecideProxyScriptComplete(int result) {
412 if (result != OK) 409 if (result != OK)
413 return result; 410 return result;
414 411
415 *effective_config_ = decider_.effective_config(); 412 *effective_config_ = decider_.effective_config();
416 next_state_ = STATE_SET_PAC_SCRIPT; 413 next_state_ = STATE_SET_PAC_SCRIPT;
417 return OK; 414 return OK;
418 } 415 }
419 416
420 int DoSetPacScript() { 417 int DoSetPacScript() {
421 DCHECK(decider_.script_data()); 418 DCHECK(decider_.script_data());
422 // TODO(eroman): Should log this latency to the NetLog. 419 // TODO(eroman): Should log this latency to the NetLog.
423 next_state_ = STATE_SET_PAC_SCRIPT_COMPLETE; 420 next_state_ = STATE_SET_PAC_SCRIPT_COMPLETE;
424 return proxy_resolver_->SetPacScript(decider_.script_data(), &io_callback_); 421 return proxy_resolver_->SetPacScript(
422 decider_.script_data(),
423 base::Bind(&InitProxyResolver::OnIOCompletion, base::Unretained(this)));
425 } 424 }
426 425
427 int DoSetPacScriptComplete(int result) { 426 int DoSetPacScriptComplete(int result) {
428 return result; 427 return result;
429 } 428 }
430 429
431 void OnIOCompletion(int result) { 430 void OnIOCompletion(int result) {
432 DCHECK_NE(STATE_NONE, next_state_); 431 DCHECK_NE(STATE_NONE, next_state_);
433 int rv = DoLoop(result); 432 int rv = DoLoop(result);
434 if (rv != ERR_IO_PENDING) 433 if (rv != ERR_IO_PENDING)
435 DoCallback(rv); 434 DoCallback(rv);
436 } 435 }
437 436
438 void DoCallback(int result) { 437 void DoCallback(int result) {
439 DCHECK_NE(ERR_IO_PENDING, result); 438 DCHECK_NE(ERR_IO_PENDING, result);
440 user_callback_->Run(result); 439 callback_.Run(result);
441 } 440 }
442 441
443 ProxyConfig config_; 442 ProxyConfig config_;
444 base::TimeDelta wait_delay_; 443 base::TimeDelta wait_delay_;
445 ProxyScriptDecider decider_; 444 ProxyScriptDecider decider_;
446 ProxyConfig* effective_config_; 445 ProxyConfig* effective_config_;
447 ProxyResolver* proxy_resolver_; 446 ProxyResolver* proxy_resolver_;
448 OldCompletionCallback* user_callback_; 447 CompletionCallback callback_;
449 OldCompletionCallbackImpl<InitProxyResolver> io_callback_;
450 State next_state_; 448 State next_state_;
451 449
452 DISALLOW_COPY_AND_ASSIGN(InitProxyResolver); 450 DISALLOW_COPY_AND_ASSIGN(InitProxyResolver);
453 }; 451 };
454 452
455 // ProxyService::PacRequest --------------------------------------------------- 453 // ProxyService::PacRequest ---------------------------------------------------
456 454
457 class ProxyService::PacRequest 455 class ProxyService::PacRequest
458 : public base::RefCounted<ProxyService::PacRequest> { 456 : public base::RefCounted<ProxyService::PacRequest> {
459 public: 457 public:
460 PacRequest(ProxyService* service, 458 PacRequest(ProxyService* service,
461 const GURL& url,
462 ProxyInfo* results,
463 OldCompletionCallback* user_callback,
464 const BoundNetLog& net_log)
465 : service_(service),
466 old_user_callback_(user_callback),
467 ALLOW_THIS_IN_INITIALIZER_LIST(io_callback_(
468 this, &PacRequest::QueryComplete)),
469 results_(results),
470 url_(url),
471 resolve_job_(NULL),
472 config_id_(ProxyConfig::kInvalidConfigID),
473 net_log_(net_log) {
474 DCHECK(user_callback);
475 }
476
477 PacRequest(ProxyService* service,
478 const GURL& url, 459 const GURL& url,
479 ProxyInfo* results, 460 ProxyInfo* results,
480 const net::CompletionCallback& user_callback, 461 const net::CompletionCallback& user_callback,
481 const BoundNetLog& net_log) 462 const BoundNetLog& net_log)
482 : service_(service), 463 : service_(service),
483 old_user_callback_(NULL),
484 user_callback_(user_callback), 464 user_callback_(user_callback),
485 ALLOW_THIS_IN_INITIALIZER_LIST(io_callback_(
486 this, &PacRequest::QueryComplete)),
487 results_(results), 465 results_(results),
488 url_(url), 466 url_(url),
489 resolve_job_(NULL), 467 resolve_job_(NULL),
490 config_id_(ProxyConfig::kInvalidConfigID), 468 config_id_(ProxyConfig::kInvalidConfigID),
491 net_log_(net_log) { 469 net_log_(net_log) {
492 DCHECK(!user_callback.is_null()); 470 DCHECK(!user_callback.is_null());
493 } 471 }
494 472
495 // Starts the resolve proxy request. 473 // Starts the resolve proxy request.
496 int Start() { 474 int Start() {
497 DCHECK(!was_cancelled()); 475 DCHECK(!was_cancelled());
498 DCHECK(!is_started()); 476 DCHECK(!is_started());
499 477
500 DCHECK(service_->config_.is_valid()); 478 DCHECK(service_->config_.is_valid());
501 479
502 config_id_ = service_->config_.id(); 480 config_id_ = service_->config_.id();
503 481
504 return resolver()->GetProxyForURL( 482 return resolver()->GetProxyForURL(
505 url_, results_, &io_callback_, &resolve_job_, net_log_); 483 url_, results_,
484 base::Bind(&PacRequest::QueryComplete, base::Unretained(this)),
485 &resolve_job_, net_log_);
506 } 486 }
507 487
508 bool is_started() const { 488 bool is_started() const {
509 // Note that !! casts to bool. (VS gives a warning otherwise). 489 // Note that !! casts to bool. (VS gives a warning otherwise).
510 return !!resolve_job_; 490 return !!resolve_job_;
511 } 491 }
512 492
513 void StartAndCompleteCheckingForSynchronous() { 493 void StartAndCompleteCheckingForSynchronous() {
514 int rv = service_->TryToCompleteSynchronously(url_, results_); 494 int rv = service_->TryToCompleteSynchronously(url_, results_);
515 if (rv == ERR_IO_PENDING) 495 if (rv == ERR_IO_PENDING)
(...skipping 11 matching lines...) Expand all
527 } 507 }
528 508
529 void Cancel() { 509 void Cancel() {
530 net_log_.AddEvent(NetLog::TYPE_CANCELLED, NULL); 510 net_log_.AddEvent(NetLog::TYPE_CANCELLED, NULL);
531 511
532 if (is_started()) 512 if (is_started())
533 CancelResolveJob(); 513 CancelResolveJob();
534 514
535 // Mark as cancelled, to prevent accessing this again later. 515 // Mark as cancelled, to prevent accessing this again later.
536 service_ = NULL; 516 service_ = NULL;
537 old_user_callback_ = NULL;
538 user_callback_.Reset(); 517 user_callback_.Reset();
539 results_ = NULL; 518 results_ = NULL;
540 519
541 net_log_.EndEvent(NetLog::TYPE_PROXY_SERVICE, NULL); 520 net_log_.EndEvent(NetLog::TYPE_PROXY_SERVICE, NULL);
542 } 521 }
543 522
544 // Returns true if Cancel() has been called. 523 // Returns true if Cancel() has been called.
545 bool was_cancelled() const { 524 bool was_cancelled() const {
546 return old_user_callback_ == NULL && user_callback_.is_null(); 525 return user_callback_.is_null();
547 } 526 }
548 527
549 // Helper to call after ProxyResolver completion (both synchronous and 528 // Helper to call after ProxyResolver completion (both synchronous and
550 // asynchronous). Fixes up the result that is to be returned to user. 529 // asynchronous). Fixes up the result that is to be returned to user.
551 int QueryDidComplete(int result_code) { 530 int QueryDidComplete(int result_code) {
552 DCHECK(!was_cancelled()); 531 DCHECK(!was_cancelled());
553 532
554 // Make a note in the results which configuration was in use at the 533 // Make a note in the results which configuration was in use at the
555 // time of the resolve. 534 // time of the resolve.
556 results_->config_id_ = config_id_; 535 results_->config_id_ = config_id_;
(...skipping 17 matching lines...) Expand all
574 friend class base::RefCounted<ProxyService::PacRequest>; 553 friend class base::RefCounted<ProxyService::PacRequest>;
575 554
576 ~PacRequest() {} 555 ~PacRequest() {}
577 556
578 // Callback for when the ProxyResolver request has completed. 557 // Callback for when the ProxyResolver request has completed.
579 void QueryComplete(int result_code) { 558 void QueryComplete(int result_code) {
580 result_code = QueryDidComplete(result_code); 559 result_code = QueryDidComplete(result_code);
581 560
582 // Remove this completed PacRequest from the service's pending list. 561 // Remove this completed PacRequest from the service's pending list.
583 /// (which will probably cause deletion of |this|). 562 /// (which will probably cause deletion of |this|).
584 if (old_user_callback_) { 563 if (!user_callback_.is_null()){
585 OldCompletionCallback* callback = old_user_callback_;
586 service_->RemovePendingRequest(this);
587 callback->Run(result_code);
588 } else if (!user_callback_.is_null()){
589 net::CompletionCallback callback = user_callback_; 564 net::CompletionCallback callback = user_callback_;
590 service_->RemovePendingRequest(this); 565 service_->RemovePendingRequest(this);
591 callback.Run(result_code); 566 callback.Run(result_code);
592 } 567 }
593 } 568 }
594 569
595 ProxyResolver* resolver() const { return service_->resolver_.get(); } 570 ProxyResolver* resolver() const { return service_->resolver_.get(); }
596 571
597 // Note that we don't hold a reference to the ProxyService. Outstanding 572 // Note that we don't hold a reference to the ProxyService. Outstanding
598 // requests are cancelled during ~ProxyService, so this is guaranteed 573 // requests are cancelled during ~ProxyService, so this is guaranteed
599 // to be valid throughout our lifetime. 574 // to be valid throughout our lifetime.
600 ProxyService* service_; 575 ProxyService* service_;
601 OldCompletionCallback* old_user_callback_;
602 net::CompletionCallback user_callback_; 576 net::CompletionCallback user_callback_;
603 OldCompletionCallbackImpl<PacRequest> io_callback_;
604 ProxyInfo* results_; 577 ProxyInfo* results_;
605 GURL url_; 578 GURL url_;
606 ProxyResolver::RequestHandle resolve_job_; 579 ProxyResolver::RequestHandle resolve_job_;
607 ProxyConfig::ID config_id_; // The config id when the resolve was started. 580 ProxyConfig::ID config_id_; // The config id when the resolve was started.
608 BoundNetLog net_log_; 581 BoundNetLog net_log_;
609 }; 582 };
610 583
611 // ProxyService --------------------------------------------------------------- 584 // ProxyService ---------------------------------------------------------------
612 585
613 ProxyService::ProxyService(ProxyConfigService* config_service, 586 ProxyService::ProxyService(ProxyConfigService* config_service,
614 ProxyResolver* resolver, 587 ProxyResolver* resolver,
615 NetLog* net_log) 588 NetLog* net_log)
616 : resolver_(resolver), 589 : resolver_(resolver),
617 next_config_id_(1), 590 next_config_id_(1),
618 ALLOW_THIS_IN_INITIALIZER_LIST(init_proxy_resolver_callback_(
619 this, &ProxyService::OnInitProxyResolverComplete)),
620 current_state_(STATE_NONE) , 591 current_state_(STATE_NONE) ,
621 net_log_(net_log), 592 net_log_(net_log),
622 stall_proxy_auto_config_delay_( 593 stall_proxy_auto_config_delay_(
623 base::TimeDelta::FromMilliseconds( 594 base::TimeDelta::FromMilliseconds(
624 kNumMillisToStallAfterNetworkChanges)) { 595 kNumMillisToStallAfterNetworkChanges)) {
625 NetworkChangeNotifier::AddIPAddressObserver(this); 596 NetworkChangeNotifier::AddIPAddressObserver(this);
626 ResetConfigService(config_service); 597 ResetConfigService(config_service);
627 } 598 }
628 599
629 // static 600 // static
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
733 scoped_ptr<ProxyResolver> proxy_resolver( 704 scoped_ptr<ProxyResolver> proxy_resolver(
734 new ProxyResolverFromPacString(pac_string)); 705 new ProxyResolverFromPacString(pac_string));
735 706
736 return new ProxyService(proxy_config_service.release(), 707 return new ProxyService(proxy_config_service.release(),
737 proxy_resolver.release(), 708 proxy_resolver.release(),
738 NULL); 709 NULL);
739 } 710 }
740 711
741 int ProxyService::ResolveProxy(const GURL& raw_url, 712 int ProxyService::ResolveProxy(const GURL& raw_url,
742 ProxyInfo* result, 713 ProxyInfo* result,
743 OldCompletionCallback* callback,
744 PacRequest** pac_request,
745 const BoundNetLog& net_log) {
746 DCHECK(CalledOnValidThread());
747 DCHECK(callback);
748
749 net_log.BeginEvent(NetLog::TYPE_PROXY_SERVICE, NULL);
750
751 config_service_->OnLazyPoll();
752 if (current_state_ == STATE_NONE)
753 ApplyProxyConfigIfAvailable();
754
755 // Strip away any reference fragments and the username/password, as they
756 // are not relevant to proxy resolution.
757 GURL url = SimplifyUrlForRequest(raw_url);
758
759 // Check if the request can be completed right away. (This is the case when
760 // using a direct connection for example).
761 int rv = TryToCompleteSynchronously(url, result);
762 if (rv != ERR_IO_PENDING)
763 return DidFinishResolvingProxy(result, rv, net_log);
764
765 scoped_refptr<PacRequest> req(
766 new PacRequest(this, url, result, callback, net_log));
767
768 if (current_state_ == STATE_READY) {
769 // Start the resolve request.
770 rv = req->Start();
771 if (rv != ERR_IO_PENDING)
772 return req->QueryDidComplete(rv);
773 } else {
774 req->net_log()->BeginEvent(NetLog::TYPE_PROXY_SERVICE_WAITING_FOR_INIT_PAC,
775 NULL);
776 }
777
778 DCHECK_EQ(ERR_IO_PENDING, rv);
779 DCHECK(!ContainsPendingRequest(req));
780 pending_requests_.push_back(req);
781
782 // Completion will be notified through |callback|, unless the caller cancels
783 // the request using |pac_request|.
784 if (pac_request)
785 *pac_request = req.get();
786 return rv; // ERR_IO_PENDING
787 }
788
789 int ProxyService::ResolveProxy(const GURL& raw_url,
790 ProxyInfo* result,
791 const net::CompletionCallback& callback, 714 const net::CompletionCallback& callback,
792 PacRequest** pac_request, 715 PacRequest** pac_request,
793 const BoundNetLog& net_log) { 716 const BoundNetLog& net_log) {
794 DCHECK(CalledOnValidThread()); 717 DCHECK(CalledOnValidThread());
795 DCHECK(!callback.is_null()); 718 DCHECK(!callback.is_null());
796 719
797 net_log.BeginEvent(NetLog::TYPE_PROXY_SERVICE, NULL); 720 net_log.BeginEvent(NetLog::TYPE_PROXY_SERVICE, NULL);
798 721
799 config_service_->OnLazyPoll(); 722 config_service_->OnLazyPoll();
800 if (current_state_ == STATE_NONE) 723 if (current_state_ == STATE_NONE)
(...skipping 434 matching lines...) Expand 10 before | Expand all | Expand 10 after
1235 new InitProxyResolver(resolver_.get(), 1158 new InitProxyResolver(resolver_.get(),
1236 proxy_script_fetcher_.get(), 1159 proxy_script_fetcher_.get(),
1237 dhcp_proxy_script_fetcher_.get(), 1160 dhcp_proxy_script_fetcher_.get(),
1238 net_log_)); 1161 net_log_));
1239 1162
1240 // If we changed networks recently, we should delay running proxy auto-config. 1163 // If we changed networks recently, we should delay running proxy auto-config.
1241 base::TimeDelta wait_delay = 1164 base::TimeDelta wait_delay =
1242 stall_proxy_autoconfig_until_ - base::TimeTicks::Now(); 1165 stall_proxy_autoconfig_until_ - base::TimeTicks::Now();
1243 1166
1244 int rv = init_proxy_resolver_->Init( 1167 int rv = init_proxy_resolver_->Init(
1245 fetched_config_, wait_delay, &config_, &init_proxy_resolver_callback_); 1168 fetched_config_, wait_delay, &config_,
1169 base::Bind(&ProxyService::OnInitProxyResolverComplete,
1170 base::Unretained(this)));
1246 1171
1247 if (rv != ERR_IO_PENDING) 1172 if (rv != ERR_IO_PENDING)
1248 OnInitProxyResolverComplete(rv); 1173 OnInitProxyResolverComplete(rv);
1249 } 1174 }
1250 1175
1251 void ProxyService::OnIPAddressChanged() { 1176 void ProxyService::OnIPAddressChanged() {
1252 // See the comment block by |kNumMillisToStallAfterNetworkChanges| for info. 1177 // See the comment block by |kNumMillisToStallAfterNetworkChanges| for info.
1253 stall_proxy_autoconfig_until_ = 1178 stall_proxy_autoconfig_until_ =
1254 base::TimeTicks::Now() + stall_proxy_auto_config_delay_; 1179 base::TimeTicks::Now() + stall_proxy_auto_config_delay_;
1255 1180
(...skipping 11 matching lines...) Expand all
1267 base::Bind(&SyncProxyServiceHelper::OnCompletion, 1192 base::Bind(&SyncProxyServiceHelper::OnCompletion,
1268 base::Unretained(this)))) { 1193 base::Unretained(this)))) {
1269 DCHECK(io_message_loop_ != MessageLoop::current()); 1194 DCHECK(io_message_loop_ != MessageLoop::current());
1270 } 1195 }
1271 1196
1272 int SyncProxyServiceHelper::ResolveProxy(const GURL& url, 1197 int SyncProxyServiceHelper::ResolveProxy(const GURL& url,
1273 ProxyInfo* proxy_info, 1198 ProxyInfo* proxy_info,
1274 const BoundNetLog& net_log) { 1199 const BoundNetLog& net_log) {
1275 DCHECK(io_message_loop_ != MessageLoop::current()); 1200 DCHECK(io_message_loop_ != MessageLoop::current());
1276 1201
1277 io_message_loop_->PostTask(FROM_HERE, NewRunnableMethod( 1202 io_message_loop_->PostTask(
1278 this, &SyncProxyServiceHelper::StartAsyncResolve, url, net_log)); 1203 FROM_HERE,
1204 base::Bind(&SyncProxyServiceHelper::StartAsyncResolve, this, url,
1205 net_log));
1279 1206
1280 event_.Wait(); 1207 event_.Wait();
1281 1208
1282 if (result_ == net::OK) { 1209 if (result_ == net::OK) {
1283 *proxy_info = proxy_info_; 1210 *proxy_info = proxy_info_;
1284 } 1211 }
1285 return result_; 1212 return result_;
1286 } 1213 }
1287 1214
1288 int SyncProxyServiceHelper::ReconsiderProxyAfterError( 1215 int SyncProxyServiceHelper::ReconsiderProxyAfterError(
1289 const GURL& url, ProxyInfo* proxy_info, const BoundNetLog& net_log) { 1216 const GURL& url, ProxyInfo* proxy_info, const BoundNetLog& net_log) {
1290 DCHECK(io_message_loop_ != MessageLoop::current()); 1217 DCHECK(io_message_loop_ != MessageLoop::current());
1291 1218
1292 io_message_loop_->PostTask(FROM_HERE, NewRunnableMethod( 1219 io_message_loop_->PostTask(
1293 this, &SyncProxyServiceHelper::StartAsyncReconsider, url, net_log)); 1220 FROM_HERE,
1221 base::Bind(&SyncProxyServiceHelper::StartAsyncReconsider, this, url,
1222 net_log));
1294 1223
1295 event_.Wait(); 1224 event_.Wait();
1296 1225
1297 if (result_ == net::OK) { 1226 if (result_ == net::OK) {
1298 *proxy_info = proxy_info_; 1227 *proxy_info = proxy_info_;
1299 } 1228 }
1300 return result_; 1229 return result_;
1301 } 1230 }
1302 1231
1303 SyncProxyServiceHelper::~SyncProxyServiceHelper() {} 1232 SyncProxyServiceHelper::~SyncProxyServiceHelper() {}
(...skipping 15 matching lines...) Expand all
1319 OnCompletion(result_); 1248 OnCompletion(result_);
1320 } 1249 }
1321 } 1250 }
1322 1251
1323 void SyncProxyServiceHelper::OnCompletion(int rv) { 1252 void SyncProxyServiceHelper::OnCompletion(int rv) {
1324 result_ = rv; 1253 result_ = rv;
1325 event_.Signal(); 1254 event_.Signal();
1326 } 1255 }
1327 1256
1328 } // namespace net 1257 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698