| OLD | NEW |
| 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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 #if defined(OS_WIN) | 7 #if defined(OS_WIN) |
| 8 #include <windows.h> | 8 #include <windows.h> |
| 9 #include <winhttp.h> | 9 #include <winhttp.h> |
| 10 #endif | 10 #endif |
| 11 | 11 |
| 12 #include <algorithm> | 12 #include <algorithm> |
| 13 | 13 |
| 14 #include "base/logging.h" | 14 #include "base/logging.h" |
| 15 #include "base/message_loop.h" | 15 #include "base/message_loop.h" |
| 16 #include "base/string_tokenizer.h" | 16 #include "base/string_tokenizer.h" |
| 17 #include "base/string_util.h" | 17 #include "base/string_util.h" |
| 18 #include "googleurl/src/gurl.h" | 18 #include "googleurl/src/gurl.h" |
| 19 #include "net/base/net_errors.h" | 19 #include "net/base/net_errors.h" |
| 20 #include "net/proxy/proxy_resolver_fixed.h" | 20 #include "net/proxy/proxy_config_service_fixed.h" |
| 21 #include "net/proxy/proxy_resolver_null.h" | |
| 22 #if defined(OS_WIN) | 21 #if defined(OS_WIN) |
| 23 #include "net/http/http_transaction_winhttp.h" | 22 #include "net/http/http_transaction_winhttp.h" |
| 23 #include "net/proxy/proxy_config_service_win.h" |
| 24 #include "net/proxy/proxy_resolver_winhttp.h" | 24 #include "net/proxy/proxy_resolver_winhttp.h" |
| 25 #elif defined(OS_MACOSX) | 25 #elif defined(OS_MACOSX) |
| 26 #include "net/proxy/proxy_resolver_mac.h" | 26 #include "net/proxy/proxy_resolver_mac.h" |
| 27 #endif | 27 #endif |
| 28 | 28 |
| 29 using base::TimeDelta; | 29 using base::TimeDelta; |
| 30 using base::TimeTicks; | 30 using base::TimeTicks; |
| 31 | 31 |
| 32 namespace net { | 32 namespace net { |
| 33 | 33 |
| 34 // Config getter that fails every time. |
| 35 class ProxyConfigServiceNull : public ProxyConfigService { |
| 36 public: |
| 37 virtual int GetProxyConfig(ProxyConfig* config) { |
| 38 return ERR_NOT_IMPLEMENTED; |
| 39 } |
| 40 }; |
| 41 |
| 42 |
| 34 // ProxyConfig ---------------------------------------------------------------- | 43 // ProxyConfig ---------------------------------------------------------------- |
| 35 | 44 |
| 36 // static | 45 // static |
| 37 ProxyConfig::ID ProxyConfig::last_id_ = ProxyConfig::INVALID_ID; | 46 ProxyConfig::ID ProxyConfig::last_id_ = ProxyConfig::INVALID_ID; |
| 38 | 47 |
| 39 ProxyConfig::ProxyConfig() | 48 ProxyConfig::ProxyConfig() |
| 40 : auto_detect(false), | 49 : auto_detect(false), |
| 41 proxy_bypass_local_names(false), | 50 proxy_bypass_local_names(false), |
| 42 id_(++last_id_) { | 51 id_(++last_id_) { |
| 43 } | 52 } |
| (...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 265 ProxyConfig::ID config_id_; | 274 ProxyConfig::ID config_id_; |
| 266 | 275 |
| 267 // Usable from within DoQuery on the PAC thread. | 276 // Usable from within DoQuery on the PAC thread. |
| 268 ProxyInfo results_buf_; | 277 ProxyInfo results_buf_; |
| 269 GURL pac_url_; | 278 GURL pac_url_; |
| 270 MessageLoop* origin_loop_; | 279 MessageLoop* origin_loop_; |
| 271 }; | 280 }; |
| 272 | 281 |
| 273 // ProxyService --------------------------------------------------------------- | 282 // ProxyService --------------------------------------------------------------- |
| 274 | 283 |
| 275 ProxyService::ProxyService(ProxyResolver* resolver) | 284 ProxyService::ProxyService(ProxyConfigService* config_service, |
| 276 : resolver_(resolver), | 285 ProxyResolver* resolver) |
| 286 : config_service_(config_service), |
| 287 resolver_(resolver), |
| 277 config_is_bad_(false), | 288 config_is_bad_(false), |
| 278 config_has_been_updated_(false) { | 289 config_has_been_updated_(false) { |
| 279 } | 290 } |
| 280 | 291 |
| 281 // static | 292 // static |
| 282 ProxyService* ProxyService::Create(const ProxyInfo* pi) { | 293 ProxyService* ProxyService::Create(const ProxyInfo* pi) { |
| 283 if (pi) { | 294 if (pi) { |
| 295 // The ProxyResolver is set to NULL, since it should never be called |
| 296 // (because the configuration will never require PAC). |
| 284 ProxyService* proxy_service = | 297 ProxyService* proxy_service = |
| 285 new ProxyService(new ProxyResolverFixed(*pi)); | 298 new ProxyService(new ProxyConfigServiceFixed(*pi), NULL); |
| 286 | 299 |
| 287 // TODO(eroman): remove this WinHTTP hack once it is no more. | 300 // TODO(eroman): remove this WinHTTP hack once it is no more. |
| 288 // We keep a copy of the ProxyInfo that was used to create the | 301 // We keep a copy of the ProxyInfo that was used to create the |
| 289 // proxy service, so we can pass it to WinHTTP. | 302 // proxy service, so we can pass it to WinHTTP. |
| 290 proxy_service->proxy_info_.reset(new ProxyInfo(*pi)); | 303 proxy_service->proxy_info_.reset(new ProxyInfo(*pi)); |
| 291 | 304 |
| 292 return proxy_service; | 305 return proxy_service; |
| 293 } | 306 } |
| 294 #if defined(OS_WIN) | 307 #if defined(OS_WIN) |
| 295 return new ProxyService(new ProxyResolverWinHttp()); | 308 return new ProxyService(new ProxyConfigServiceWin(), |
| 309 new ProxyResolverWinHttp()); |
| 296 #elif defined(OS_MACOSX) | 310 #elif defined(OS_MACOSX) |
| 297 return new ProxyService(new ProxyResolverMac()); | 311 return new ProxyService(new ProxyConfigServiceMac(), |
| 312 new ProxyResolverMac()); |
| 298 #else | 313 #else |
| 299 // This used to be a NOTIMPLEMENTED(), but that logs as an error, | 314 // This used to be a NOTIMPLEMENTED(), but that logs as an error, |
| 300 // screwing up layout tests. | 315 // screwing up layout tests. |
| 301 LOG(WARNING) << "Proxies are not implemented; remove me once that's fixed."; | 316 LOG(WARNING) << "Proxies are not implemented; remove me once that's fixed."; |
| 302 // http://code.google.com/p/chromium/issues/detail?id=4523 is the bug | 317 // http://code.google.com/p/chromium/issues/detail?id=4523 is the bug |
| 303 // to implement this. | 318 // to implement this. |
| 304 return new ProxyService(new ProxyResolverNull()); | 319 return CreateNull(); |
| 305 #endif | 320 #endif |
| 306 } | 321 } |
| 307 | 322 |
| 323 // static |
| 324 ProxyService* ProxyService::CreateNull() { |
| 325 // The ProxyResolver is set to NULL, since it should never be called |
| 326 // (because the configuration will never require PAC). |
| 327 return new ProxyService(new ProxyConfigServiceNull, NULL); |
| 328 } |
| 329 |
| 308 int ProxyService::ResolveProxy(const GURL& url, ProxyInfo* result, | 330 int ProxyService::ResolveProxy(const GURL& url, ProxyInfo* result, |
| 309 CompletionCallback* callback, | 331 CompletionCallback* callback, |
| 310 PacRequest** pac_request) { | 332 PacRequest** pac_request) { |
| 311 // The overhead of calling WinHttpGetIEProxyConfigForCurrentUser is very low. | 333 // The overhead of calling ProxyConfigService::GetProxyConfig is very low. |
| 312 const TimeDelta kProxyConfigMaxAge = TimeDelta::FromSeconds(5); | 334 const TimeDelta kProxyConfigMaxAge = TimeDelta::FromSeconds(5); |
| 313 | 335 |
| 314 // Periodically check for a new config. | 336 // Periodically check for a new config. |
| 315 if (!config_has_been_updated_ || | 337 if (!config_has_been_updated_ || |
| 316 (TimeTicks::Now() - config_last_update_time_) > kProxyConfigMaxAge) | 338 (TimeTicks::Now() - config_last_update_time_) > kProxyConfigMaxAge) |
| 317 UpdateConfig(); | 339 UpdateConfig(); |
| 318 result->config_id_ = config_.id(); | 340 result->config_id_ = config_.id(); |
| 319 | 341 |
| 320 // Fallback to a "direct" (no proxy) connection if the current configuration | 342 // Fallback to a "direct" (no proxy) connection if the current configuration |
| 321 // is known to be bad. | 343 // is known to be bad. |
| (...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 474 return; | 496 return; |
| 475 | 497 |
| 476 // Remember that this configuration doesn't work. | 498 // Remember that this configuration doesn't work. |
| 477 config_is_bad_ = true; | 499 config_is_bad_ = true; |
| 478 } | 500 } |
| 479 | 501 |
| 480 void ProxyService::UpdateConfig() { | 502 void ProxyService::UpdateConfig() { |
| 481 config_has_been_updated_ = true; | 503 config_has_been_updated_ = true; |
| 482 | 504 |
| 483 ProxyConfig latest; | 505 ProxyConfig latest; |
| 484 if (resolver_->GetProxyConfig(&latest) != OK) | 506 if (config_service_->GetProxyConfig(&latest) != OK) |
| 485 return; | 507 return; |
| 486 config_last_update_time_ = TimeTicks::Now(); | 508 config_last_update_time_ = TimeTicks::Now(); |
| 487 | 509 |
| 488 if (latest.Equals(config_)) | 510 if (latest.Equals(config_)) |
| 489 return; | 511 return; |
| 490 | 512 |
| 491 config_ = latest; | 513 config_ = latest; |
| 492 config_is_bad_ = false; | 514 config_is_bad_ = false; |
| 493 | 515 |
| 494 // We have a new config, we should clear the list of bad proxies. | 516 // We have a new config, we should clear the list of bad proxies. |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 536 // http://www.tcd.ie/iss/internet/osx_proxy.php for a real-world example). | 558 // http://www.tcd.ie/iss/internet/osx_proxy.php for a real-world example). |
| 537 // That's kinda cool so we'll provide that for everyone. | 559 // That's kinda cool so we'll provide that for everyone. |
| 538 // TODO(avi): implement here | 560 // TODO(avi): implement here |
| 539 } | 561 } |
| 540 | 562 |
| 541 return false; | 563 return false; |
| 542 } | 564 } |
| 543 | 565 |
| 544 } // namespace net | 566 } // namespace net |
| 545 | 567 |
| OLD | NEW |