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

Unified Diff: net/proxy/proxy_resolver_js_bindings.cc

Issue 11885009: Improve performance of proxy resolver by tracing DNS dependencies. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: rebase off trunk Created 7 years, 11 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 side-by-side diff with in-line comments
Download patch
Index: net/proxy/proxy_resolver_js_bindings.cc
diff --git a/net/proxy/proxy_resolver_js_bindings.cc b/net/proxy/proxy_resolver_js_bindings.cc
deleted file mode 100644
index 84dcafda4dca6f680f2c79086c264c9b5ead1457..0000000000000000000000000000000000000000
--- a/net/proxy/proxy_resolver_js_bindings.cc
+++ /dev/null
@@ -1,291 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "net/proxy/proxy_resolver_js_bindings.h"
-
-#include "base/bind.h"
-#include "base/compiler_specific.h"
-#include "base/logging.h"
-#include "base/string_util.h"
-#include "base/values.h"
-#include "net/base/address_list.h"
-#include "net/base/host_cache.h"
-#include "net/base/host_resolver.h"
-#include "net/base/net_errors.h"
-#include "net/base/net_log.h"
-#include "net/base/net_util.h"
-#include "net/proxy/proxy_resolver_error_observer.h"
-#include "net/proxy/proxy_resolver_request_context.h"
-#include "net/proxy/sync_host_resolver.h"
-
-namespace net {
-
-namespace {
-
-// TTL for the per-request DNS cache. Applies to both successful and failed
-// DNS resolutions.
-const unsigned kCacheEntryTTLSeconds = 5 * 60;
-
-// Returns event parameters for a PAC error message (line number + message).
-Value* NetLogErrorCallback(int line_number,
- const string16* message,
- NetLog::LogLevel /* log_level */) {
- DictionaryValue* dict = new DictionaryValue();
- dict->SetInteger("line_number", line_number);
- dict->SetString("message", *message);
- return dict;
-}
-
-// ProxyResolverJSBindings implementation.
-class DefaultJSBindings : public ProxyResolverJSBindings {
- public:
- DefaultJSBindings(SyncHostResolver* host_resolver,
- NetLog* net_log,
- ProxyResolverErrorObserver* error_observer)
- : host_resolver_(host_resolver),
- net_log_(net_log),
- error_observer_(error_observer) {
- }
-
- // Handler for "alert(message)".
- virtual void Alert(const string16& message) OVERRIDE {
- VLOG(1) << "PAC-alert: " << message;
-
- // Send to the NetLog.
- LogEventToCurrentRequestAndGlobally(
- NetLog::TYPE_PAC_JAVASCRIPT_ALERT,
- NetLog::StringCallback("message", &message));
- }
-
- // Handler for "myIpAddress()".
- // TODO(eroman): Perhaps enumerate the interfaces directly, using
- // getifaddrs().
- virtual bool MyIpAddress(std::string* first_ip_address) OVERRIDE {
- LogEventToCurrentRequest(NetLog::PHASE_BEGIN,
- NetLog::TYPE_PAC_JAVASCRIPT_MY_IP_ADDRESS);
-
- bool ok = MyIpAddressImpl(first_ip_address);
-
- LogEventToCurrentRequest(NetLog::PHASE_END,
- NetLog::TYPE_PAC_JAVASCRIPT_MY_IP_ADDRESS);
- return ok;
- }
-
- // Handler for "myIpAddressEx()".
- virtual bool MyIpAddressEx(std::string* ip_address_list) OVERRIDE {
- LogEventToCurrentRequest(NetLog::PHASE_BEGIN,
- NetLog::TYPE_PAC_JAVASCRIPT_MY_IP_ADDRESS_EX);
-
- bool ok = MyIpAddressExImpl(ip_address_list);
-
- LogEventToCurrentRequest(NetLog::PHASE_END,
- NetLog::TYPE_PAC_JAVASCRIPT_MY_IP_ADDRESS_EX);
- return ok;
- }
-
- // Handler for "dnsResolve(host)".
- virtual bool DnsResolve(const std::string& host,
- std::string* first_ip_address) OVERRIDE {
- LogEventToCurrentRequest(NetLog::PHASE_BEGIN,
- NetLog::TYPE_PAC_JAVASCRIPT_DNS_RESOLVE);
-
- bool ok = DnsResolveImpl(host, first_ip_address);
-
- LogEventToCurrentRequest(NetLog::PHASE_END,
- NetLog::TYPE_PAC_JAVASCRIPT_DNS_RESOLVE);
- return ok;
- }
-
- // Handler for "dnsResolveEx(host)".
- virtual bool DnsResolveEx(const std::string& host,
- std::string* ip_address_list) OVERRIDE {
- LogEventToCurrentRequest(NetLog::PHASE_BEGIN,
- NetLog::TYPE_PAC_JAVASCRIPT_DNS_RESOLVE_EX);
-
- bool ok = DnsResolveExImpl(host, ip_address_list);
-
- LogEventToCurrentRequest(NetLog::PHASE_END,
- NetLog::TYPE_PAC_JAVASCRIPT_DNS_RESOLVE_EX);
- return ok;
- }
-
- // Handler for when an error is encountered. |line_number| may be -1.
- virtual void OnError(int line_number, const string16& message) OVERRIDE {
- // Send to the chrome log.
- if (line_number == -1)
- VLOG(1) << "PAC-error: " << message;
- else
- VLOG(1) << "PAC-error: " << "line: " << line_number << ": " << message;
-
- // Send the error to the NetLog.
- LogEventToCurrentRequestAndGlobally(
- NetLog::TYPE_PAC_JAVASCRIPT_ERROR,
- base::Bind(&NetLogErrorCallback, line_number, &message));
-
- if (error_observer_.get())
- error_observer_->OnPACScriptError(line_number, message);
- }
-
- virtual void Shutdown() OVERRIDE {
- host_resolver_->Shutdown();
- }
-
- private:
- bool MyIpAddressImpl(std::string* first_ip_address) {
- std::string my_hostname = GetHostName();
- if (my_hostname.empty())
- return false;
- return DnsResolveImpl(my_hostname, first_ip_address);
- }
-
- bool MyIpAddressExImpl(std::string* ip_address_list) {
- std::string my_hostname = GetHostName();
- if (my_hostname.empty())
- return false;
- return DnsResolveExImpl(my_hostname, ip_address_list);
- }
-
- bool DnsResolveImpl(const std::string& host,
- std::string* first_ip_address) {
- // Do a sync resolve of the hostname (port doesn't matter).
- // Disable IPv6 results. We do this because the PAC specification isn't
- // really IPv6 friendly, and Internet Explorer also restricts to IPv4.
- // Consequently a lot of existing PAC scripts assume they will only get
- // IPv4 results, and will misbehave if they get an IPv6 result.
- // See http://crbug.com/24641 for more details.
- HostResolver::RequestInfo info(HostPortPair(host, 80));
- info.set_address_family(ADDRESS_FAMILY_IPV4);
- AddressList address_list;
-
- int result = DnsResolveHelper(info, &address_list);
- if (result != OK)
- return false;
-
- // There may be multiple results; we will just use the first one.
- // This returns empty string on failure.
- *first_ip_address = address_list.front().ToStringWithoutPort();
- if (first_ip_address->empty())
- return false;
-
- return true;
- }
-
- bool DnsResolveExImpl(const std::string& host,
- std::string* ip_address_list) {
- // Do a sync resolve of the hostname (port doesn't matter).
- HostResolver::RequestInfo info(HostPortPair(host, 80));
- AddressList address_list;
- int result = DnsResolveHelper(info, &address_list);
-
- if (result != OK)
- return false;
-
- // Stringify all of the addresses in the address list, separated
- // by semicolons.
- std::string address_list_str;
- for (AddressList::const_iterator iter = address_list.begin();
- iter != address_list.end(); ++iter) {
- if (!address_list_str.empty())
- address_list_str += ";";
- const std::string address_string = iter->ToStringWithoutPort();
- if (address_string.empty())
- return false;
- address_list_str += address_string;
- }
-
- *ip_address_list = address_list_str;
- return true;
- }
-
- // Helper to execute a synchronous DNS resolve, using the per-request
- // DNS cache if there is one.
- int DnsResolveHelper(const HostResolver::RequestInfo& info,
- AddressList* address_list) {
- HostCache::Key cache_key(info.hostname(),
- info.address_family(),
- info.host_resolver_flags());
-
- HostCache* host_cache = current_request_context() ?
- current_request_context()->host_cache : NULL;
-
- // First try to service this request from the per-request DNS cache.
- // (we cache DNS failures much more aggressively within the context
- // of a FindProxyForURL() request).
- if (host_cache) {
- const HostCache::Entry* entry =
- host_cache->Lookup(cache_key, base::TimeTicks::Now());
- if (entry) {
- if (entry->error == OK)
- *address_list = entry->addrlist;
- return entry->error;
- }
- }
-
- // Otherwise ask the host resolver.
- const BoundNetLog* net_log = GetNetLogForCurrentRequest();
- int result = host_resolver_->Resolve(info,
- address_list,
- net_log ? *net_log : BoundNetLog());
-
- // Save the result back to the per-request DNS cache.
- if (host_cache) {
- host_cache->Set(cache_key, HostCache::Entry(result, *address_list),
- base::TimeTicks::Now(),
- base::TimeDelta::FromSeconds(kCacheEntryTTLSeconds));
- }
-
- return result;
- }
-
- // May return NULL.
- const BoundNetLog* GetNetLogForCurrentRequest() {
- if (!current_request_context())
- return NULL;
- return current_request_context()->net_log;
- }
-
- void LogEventToCurrentRequest(
- NetLog::EventPhase phase,
- NetLog::EventType type) {
- const BoundNetLog* net_log = GetNetLogForCurrentRequest();
- if (net_log)
- net_log->AddEntry(type, phase);
- }
-
- void LogEventToCurrentRequest(
- NetLog::EventPhase phase,
- NetLog::EventType type,
- const NetLog::ParametersCallback& parameters_callback) {
- const BoundNetLog* net_log = GetNetLogForCurrentRequest();
- if (net_log)
- net_log->AddEntry(type, phase, parameters_callback);
- }
-
- void LogEventToCurrentRequestAndGlobally(
- NetLog::EventType type,
- const NetLog::ParametersCallback& parameters_callback) {
- LogEventToCurrentRequest(NetLog::PHASE_NONE, type, parameters_callback);
-
- // Emit to the global NetLog event stream.
- if (net_log_)
- net_log_->AddGlobalEntry(type, parameters_callback);
- }
-
- scoped_ptr<SyncHostResolver> host_resolver_;
- NetLog* net_log_;
- scoped_ptr<ProxyResolverErrorObserver> error_observer_;
- DISALLOW_COPY_AND_ASSIGN(DefaultJSBindings);
-};
-
-} // namespace
-
-// static
-ProxyResolverJSBindings* ProxyResolverJSBindings::CreateDefault(
- SyncHostResolver* host_resolver,
- NetLog* net_log,
- ProxyResolverErrorObserver* error_observer) {
- return new DefaultJSBindings(host_resolver, net_log, error_observer);
-}
-
-} // namespace net

Powered by Google App Engine
This is Rietveld 408576698