host_resolver.h revision f8ee788a64d60abd8f2d742a5fdedde054ecd910
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef NET_DNS_HOST_RESOLVER_H_
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define NET_DNS_HOST_RESOLVER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/address_family.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/completion_callback.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/host_port_pair.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_export.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_util.h"
16f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "net/base/prioritized_dispatcher.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/request_priority.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Value;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AddressList;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BoundNetLog;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HostCache;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HostResolverProc;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NetLog;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class represents the task of resolving hostnames (or IP address
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// literal) to an AddressList object.
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// HostResolver can handle multiple requests at a time, so when cancelling a
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// request the RequestHandle that was returned by Resolve() needs to be
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// given.  A simpler alternative for consumers that only have 1 outstanding
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// request at a time is to create a SingleRequestHostResolver wrapper around
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// HostResolver (which will automatically cancel the single request when it
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// goes out of scope).
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NET_EXPORT HostResolver {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |max_concurrent_resolves| is how many resolve requests will be allowed to
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // run in parallel. Pass HostResolver::kDefaultParallelism to choose a
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // default value.
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |max_retry_attempts| is the maximum number of times we will retry for host
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // resolution. Pass HostResolver::kDefaultRetryAttempts to choose a default
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // value.
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |enable_caching| controls whether a HostCache is used.
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct NET_EXPORT Options {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Options();
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    PrioritizedDispatcher::Limits GetDispatcherLimits() const;
53f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t max_concurrent_resolves;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t max_retry_attempts;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool enable_caching;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // The parameters for doing a Resolve(). A hostname and port are
603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // required; the rest are optional (and have reasonable defaults).
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class NET_EXPORT RequestInfo {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    explicit RequestInfo(const HostPortPair& host_port_pair);
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const HostPortPair& host_port_pair() const { return host_port_pair_; }
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void set_host_port_pair(const HostPortPair& host_port_pair) {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      host_port_pair_ = host_port_pair;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int port() const { return host_port_pair_.port(); }
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& hostname() const { return host_port_pair_.host(); }
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddressFamily address_family() const { return address_family_; }
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void set_address_family(AddressFamily address_family) {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      address_family_ = address_family;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HostResolverFlags host_resolver_flags() const {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return host_resolver_flags_;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void set_host_resolver_flags(HostResolverFlags host_resolver_flags) {
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      host_resolver_flags_ = host_resolver_flags;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool allow_cached_response() const { return allow_cached_response_; }
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void set_allow_cached_response(bool b) { allow_cached_response_ = b; }
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool is_speculative() const { return is_speculative_; }
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void set_is_speculative(bool b) { is_speculative_ = b; }
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   private:
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The hostname to resolve, and the port to use in resulting sockaddrs.
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HostPortPair host_port_pair_;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The address family to restrict results to.
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddressFamily address_family_;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Flags to use when resolving this request.
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HostResolverFlags host_resolver_flags_;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Whether it is ok to return a result from the host cache.
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool allow_cached_response_;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Whether this request was started by the DNS prefetcher.
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool is_speculative_;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Opaque type used to cancel a request.
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef void* RequestHandle;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
111f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Set Options.max_concurrent_resolves to this to select a default level
112f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // of concurrency.
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const size_t kDefaultParallelism = 0;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Set Options.max_retry_attempts to this to select a default retry value.
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const size_t kDefaultRetryAttempts = -1;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If any completion callbacks are pending when the resolver is destroyed,
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the host resolutions are cancelled, and the completion callbacks will not
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // be called.
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~HostResolver();
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Resolves the given hostname (or IP address literal), filling out the
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |addresses| object upon success.  The |info.port| parameter will be set as
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the sin(6)_port field of the sockaddr_in{6} struct.  Returns OK if
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // successful or an error code upon failure.  Returns
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ERR_NAME_NOT_RESOLVED if hostname is invalid, or if it is an
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // incompatible IP literal (e.g. IPv6 is disabled and it is an IPv6
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // literal).
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the operation cannot be completed synchronously, ERR_IO_PENDING will
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // be returned and the real result code will be passed to the completion
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // callback.  Otherwise the result code is returned immediately from this
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // call.
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If |out_req| is non-NULL, then |*out_req| will be filled with a handle to
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the async request. This handle is not valid after the request has
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // completed.
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Profiling information for the request is saved to |net_log| if non-NULL.
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int Resolve(const RequestInfo& info,
1423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                      RequestPriority priority,
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      AddressList* addresses,
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const CompletionCallback& callback,
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      RequestHandle* out_req,
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const BoundNetLog& net_log) = 0;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Resolves the given hostname (or IP address literal) out of cache or HOSTS
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // file (if enabled) only. This is guaranteed to complete synchronously.
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This acts like |Resolve()| if the hostname is IP literal, or cached value
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // or HOSTS entry exists. Otherwise, ERR_DNS_CACHE_MISS is returned.
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int ResolveFromCache(const RequestInfo& info,
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               AddressList* addresses,
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               const BoundNetLog& net_log) = 0;
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Cancels the specified request. |req| is the handle returned by Resolve().
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // After a request is canceled, its completion callback will not be called.
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // CancelRequest must NOT be called after the request's completion callback
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // has already run or the request was canceled.
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void CancelRequest(RequestHandle req) = 0;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets the default AddressFamily to use when requests have left it
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // unspecified. For example, this could be used to restrict resolution
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // results to AF_INET by passing in ADDRESS_FAMILY_IPV4, or to
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // AF_INET6 by passing in ADDRESS_FAMILY_IPV6.
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetDefaultAddressFamily(AddressFamily address_family) {}
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual AddressFamily GetDefaultAddressFamily() const;
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Enable or disable the built-in asynchronous DnsClient.
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetDnsClientEnabled(bool enabled);
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the HostResolverCache |this| uses, or NULL if there isn't one.
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used primarily to clear the cache and for getting debug information.
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual HostCache* GetHostCache();
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the current DNS configuration |this| is using, as a Value, or NULL
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // if it's configured to always use the system host resolver.  Caller takes
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ownership of the returned Value.
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual base::Value* GetDnsConfigAsValue() const;
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates a HostResolver implementation that queries the underlying system.
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (Except if a unit-test has changed the global HostResolverProc using
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ScopedHostResolverProc to intercept requests to the system).
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static scoped_ptr<HostResolver> CreateSystemResolver(
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const Options& options,
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NetLog* net_log);
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // As above, but uses default parameters.
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static scoped_ptr<HostResolver> CreateDefaultResolver(NetLog* net_log);
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HostResolver();
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(HostResolver);
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // NET_DNS_HOST_RESOLVER_H_
201