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
14namespace net {
15
16class 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.
25class 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.
87NET_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.
95class 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