Home | History | Annotate | Download | only in dns
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef NET_DNS_HOST_RESOLVER_PROC_H_
      6 #define NET_DNS_HOST_RESOLVER_PROC_H_
      7 
      8 #include <string>
      9 
     10 #include "base/memory/ref_counted.h"
     11 #include "net/base/address_family.h"
     12 #include "net/base/net_export.h"
     13 
     14 namespace net {
     15 
     16 class AddressList;
     17 
     18 // Interface for a getaddrinfo()-like procedure. This is used by unit-tests
     19 // to control the underlying resolutions in HostResolverImpl. HostResolverProcs
     20 // can be chained together; they fallback to the next procedure in the chain
     21 // by calling ResolveUsingPrevious().
     22 //
     23 // Note that implementations of HostResolverProc *MUST BE THREADSAFE*, since
     24 // the HostResolver implementation using them can be multi-threaded.
     25 class NET_EXPORT HostResolverProc
     26     : public base::RefCountedThreadSafe<HostResolverProc> {
     27  public:
     28   explicit HostResolverProc(HostResolverProc* previous);
     29 
     30   // Resolves |host| to an address list, restricting the results to addresses
     31   // in |address_family|. If successful returns OK and fills |addrlist| with
     32   // a list of socket addresses. Otherwise returns a network error code, and
     33   // fills |os_error| with a more specific error if it was non-NULL.
     34   virtual int Resolve(const std::string& host,
     35                       AddressFamily address_family,
     36                       HostResolverFlags host_resolver_flags,
     37                       AddressList* addrlist,
     38                       int* os_error) = 0;
     39 
     40  protected:
     41   friend class base::RefCountedThreadSafe<HostResolverProc>;
     42 
     43   virtual ~HostResolverProc();
     44 
     45   // Asks the fallback procedure (if set) to do the resolve.
     46   int ResolveUsingPrevious(const std::string& host,
     47                            AddressFamily address_family,
     48                            HostResolverFlags host_resolver_flags,
     49                            AddressList* addrlist,
     50                            int* os_error);
     51 
     52  private:
     53   friend class HostResolverImpl;
     54   friend class MockHostResolverBase;
     55   friend class ScopedDefaultHostResolverProc;
     56 
     57   // Sets the previous procedure in the chain.  Aborts if this would result in a
     58   // cycle.
     59   void SetPreviousProc(HostResolverProc* proc);
     60 
     61   // Sets the last procedure in the chain, i.e. appends |proc| to the end of the
     62   // current chain.  Aborts if this would result in a cycle.
     63   void SetLastProc(HostResolverProc* proc);
     64 
     65   // Returns the last procedure in the chain starting at |proc|.  Will return
     66   // NULL iff |proc| is NULL.
     67   static HostResolverProc* GetLastProc(HostResolverProc* proc);
     68 
     69   // Sets the default host resolver procedure that is used by HostResolverImpl.
     70   // This can be used through ScopedDefaultHostResolverProc to set a catch-all
     71   // DNS block in unit-tests (individual tests should use MockHostResolver to
     72   // prevent hitting the network).
     73   static HostResolverProc* SetDefault(HostResolverProc* proc);
     74   static HostResolverProc* GetDefault();
     75 
     76   scoped_refptr<HostResolverProc> previous_proc_;
     77   static HostResolverProc* default_proc_;
     78 
     79   DISALLOW_COPY_AND_ASSIGN(HostResolverProc);
     80 };
     81 
     82 // Resolves |host| to an address list, using the system's default host resolver.
     83 // (i.e. this calls out to getaddrinfo()). If successful returns OK and fills
     84 // |addrlist| with a list of socket addresses. Otherwise returns a
     85 // network error code, and fills |os_error| with a more specific error if it
     86 // was non-NULL.
     87 NET_EXPORT_PRIVATE int SystemHostResolverCall(
     88     const std::string& host,
     89     AddressFamily address_family,
     90     HostResolverFlags host_resolver_flags,
     91     AddressList* addrlist,
     92     int* os_error);
     93 
     94 // Wraps call to SystemHostResolverCall as an instance of HostResolverProc.
     95 class NET_EXPORT_PRIVATE SystemHostResolverProc : public HostResolverProc {
     96  public:
     97   SystemHostResolverProc();
     98   virtual int Resolve(const std::string& hostname,
     99                       AddressFamily address_family,
    100                       HostResolverFlags host_resolver_flags,
    101                       AddressList* addr_list,
    102                       int* os_error) OVERRIDE;
    103  protected:
    104   virtual ~SystemHostResolverProc();
    105 
    106   DISALLOW_COPY_AND_ASSIGN(SystemHostResolverProc);
    107 };
    108 
    109 }  // namespace net
    110 
    111 #endif  // NET_DNS_HOST_RESOLVER_PROC_H_
    112