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