| 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 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/compiler_specific.h" | 9 #include "base/compiler_specific.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 64 private: | 64 private: |
| 65 ProxyResolver* resolver_; | 65 ProxyResolver* resolver_; |
| 66 std::string bytes_; | 66 std::string bytes_; |
| 67 }; | 67 }; |
| 68 | 68 |
| 69 // ProxyService::PacRequest --------------------------------------------------- | 69 // ProxyService::PacRequest --------------------------------------------------- |
| 70 | 70 |
| 71 // We rely on the fact that the origin thread (and its message loop) will not | 71 // We rely on the fact that the origin thread (and its message loop) will not |
| 72 // be destroyed until after the PAC thread is destroyed. | 72 // be destroyed until after the PAC thread is destroyed. |
| 73 | 73 |
| 74 class ProxyService::PacRequest : | 74 class ProxyService::PacRequest |
| 75 public base::RefCountedThreadSafe<ProxyService::PacRequest> { | 75 : public base::RefCountedThreadSafe<ProxyService::PacRequest> { |
| 76 public: | 76 public: |
| 77 // |service| -- the ProxyService that owns this request. | 77 // |service| -- the ProxyService that owns this request. |
| 78 // |url| -- the url of the query. | 78 // |url| -- the url of the query. |
| 79 // |results| -- the structure to fill with proxy resolve results. | 79 // |results| -- the structure to fill with proxy resolve results. |
| 80 PacRequest(ProxyService* service, | 80 PacRequest(ProxyService* service, |
| 81 const GURL& url, | 81 const GURL& url, |
| 82 ProxyInfo* results, | 82 ProxyInfo* results, |
| 83 CompletionCallback* callback) | 83 CompletionCallback* callback) |
| 84 : service_(service), | 84 : service_(service), |
| 85 callback_(callback), | 85 callback_(callback), |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 186 next_config_id_(1), | 186 next_config_id_(1), |
| 187 config_is_bad_(false), | 187 config_is_bad_(false), |
| 188 ALLOW_THIS_IN_INITIALIZER_LIST(proxy_script_fetcher_callback_( | 188 ALLOW_THIS_IN_INITIALIZER_LIST(proxy_script_fetcher_callback_( |
| 189 this, &ProxyService::OnScriptFetchCompletion)), | 189 this, &ProxyService::OnScriptFetchCompletion)), |
| 190 fetched_pac_config_id_(ProxyConfig::INVALID_ID), | 190 fetched_pac_config_id_(ProxyConfig::INVALID_ID), |
| 191 fetched_pac_error_(OK), | 191 fetched_pac_error_(OK), |
| 192 in_progress_fetch_config_id_(ProxyConfig::INVALID_ID) { | 192 in_progress_fetch_config_id_(ProxyConfig::INVALID_ID) { |
| 193 } | 193 } |
| 194 | 194 |
| 195 // static | 195 // static |
| 196 ProxyService* ProxyService::Create(const ProxyInfo* pi) { | 196 ProxyService* ProxyService::Create(const ProxyConfig* pc) { |
| 197 if (pi) { | 197 scoped_ptr<ProxyConfigService> proxy_config_service; |
| 198 // The ProxyResolver is set to NULL, since it should never be called | 198 scoped_ptr<ProxyResolver> proxy_resolver; |
| 199 // (because the configuration will never require PAC). | 199 if (pc) { |
| 200 return new ProxyService(new ProxyConfigServiceFixed(*pi), NULL); | 200 proxy_config_service.reset(new ProxyConfigServiceFixed(*pc)); |
| 201 } | 201 } |
| 202 |
| 202 #if defined(OS_WIN) | 203 #if defined(OS_WIN) |
| 203 return new ProxyService(new ProxyConfigServiceWin(), | 204 if (proxy_config_service == NULL) |
| 204 new ProxyResolverWinHttp()); | 205 proxy_config_service.reset(new ProxyConfigServiceWin()); |
| 206 proxy_resolver.reset(new ProxyResolverWinHttp()); |
| 205 #elif defined(OS_MACOSX) | 207 #elif defined(OS_MACOSX) |
| 206 return new ProxyService(new ProxyConfigServiceMac(), | 208 if (proxy_config_service == NULL) |
| 207 new ProxyResolverMac()); | 209 proxy_config_service.reset(new ProxyConfigServiceMac()); |
| 210 proxy_resolver.reset(new ProxyResolverMac()); |
| 208 #elif defined(OS_LINUX) | 211 #elif defined(OS_LINUX) |
| 209 // On Linux we use the V8Resolver, no fallback implementation. | 212 // On Linux we use the V8Resolver, no fallback implementation. |
| 210 return CreateNull(); | 213 // This means that if we got called with a ProxyConfig that could require a |
| 214 // resolver, or if the caller is trying to create a regular ProxyService via |
| 215 // this method instead of CreateUsingV8Resolver() we have to return a |
| 216 // nulled-out ProxyService. |
| 217 if (!pc || pc->MayRequirePACResolver()) { |
| 218 LOG(WARNING) << "Attempting to create a ProxyService with a non-v8 " |
| 219 << "resolver using an invalid ProxyConfig."; |
| 220 return CreateNull(); |
| 221 } |
| 211 #else | 222 #else |
| 212 return CreateNull(); | 223 return CreateNull(); |
| 213 #endif | 224 #endif |
| 225 |
| 226 return new ProxyService(proxy_config_service.release(), |
| 227 proxy_resolver.release()); |
| 214 } | 228 } |
| 215 | 229 |
| 216 // static | 230 // static |
| 217 ProxyService* ProxyService::CreateUsingV8Resolver( | 231 ProxyService* ProxyService::CreateUsingV8Resolver( |
| 218 const ProxyInfo* pi, URLRequestContext* url_request_context) { | 232 const ProxyConfig* pc, URLRequestContext* url_request_context) { |
| 219 if (pi) { | 233 // Choose the system configuration service appropriate for each platform. |
| 220 // The ProxyResolver is set to NULL, since it should never be called | 234 ProxyConfigService* config_service = NULL; |
| 221 // (because the configuration will never require PAC). | 235 if (pc) { |
| 222 return new ProxyService(new ProxyConfigServiceFixed(*pi), NULL); | 236 config_service = new ProxyConfigServiceFixed(*pc); |
| 237 } else { |
| 238 #if defined(OS_WIN) |
| 239 config_service = new ProxyConfigServiceWin(); |
| 240 #elif defined(OS_MACOSX) |
| 241 config_service = new ProxyConfigServiceMac(); |
| 242 #elif defined(OS_LINUX) |
| 243 config_service = new ProxyConfigServiceLinux(); |
| 244 #else |
| 245 return CreateNull(); |
| 246 #endif |
| 223 } | 247 } |
| 224 | 248 |
| 225 // Choose the system configuration service appropriate for each platform. | |
| 226 ProxyConfigService* config_service; | |
| 227 #if defined(OS_WIN) | |
| 228 config_service = new ProxyConfigServiceWin(); | |
| 229 #elif defined(OS_MACOSX) | |
| 230 config_service = new ProxyConfigServiceMac(); | |
| 231 #elif defined(OS_LINUX) | |
| 232 config_service = new ProxyConfigServiceLinux(); | |
| 233 #else | |
| 234 return CreateNull(); | |
| 235 #endif | |
| 236 | |
| 237 // Create a ProxyService that uses V8 to evaluate PAC scripts. | 249 // Create a ProxyService that uses V8 to evaluate PAC scripts. |
| 238 ProxyService* proxy_service = new ProxyService( | 250 ProxyService* proxy_service = new ProxyService( |
| 239 config_service, new ProxyResolverV8()); | 251 config_service, new ProxyResolverV8()); |
| 240 | 252 |
| 241 // Configure PAC script downloads to be issued using |url_request_context|. | 253 // Configure PAC script downloads to be issued using |url_request_context|. |
| 242 proxy_service->SetProxyScriptFetcher( | 254 proxy_service->SetProxyScriptFetcher( |
| 243 ProxyScriptFetcher::Create(url_request_context)); | 255 ProxyScriptFetcher::Create(url_request_context)); |
| 244 | 256 |
| 245 return proxy_service; | 257 return proxy_service; |
| 246 } | 258 } |
| (...skipping 461 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 708 OnCompletion(result_); | 720 OnCompletion(result_); |
| 709 } | 721 } |
| 710 } | 722 } |
| 711 | 723 |
| 712 void SyncProxyServiceHelper::OnCompletion(int rv) { | 724 void SyncProxyServiceHelper::OnCompletion(int rv) { |
| 713 result_ = rv; | 725 result_ = rv; |
| 714 event_.Signal(); | 726 event_.Signal(); |
| 715 } | 727 } |
| 716 | 728 |
| 717 } // namespace net | 729 } // namespace net |
| OLD | NEW |