| // 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. |
| |
| #ifndef NET_DNS_HOST_RESOLVER_PROC_H_ |
| #define NET_DNS_HOST_RESOLVER_PROC_H_ |
| |
| #include <string> |
| |
| #include "base/macros.h" |
| #include "base/memory/ref_counted.h" |
| #include "net/base/address_family.h" |
| #include "net/base/net_export.h" |
| |
| namespace net { |
| |
| class AddressList; |
| |
| // Interface for a getaddrinfo()-like procedure. This is used by unit-tests |
| // to control the underlying resolutions in HostResolverImpl. HostResolverProcs |
| // can be chained together; they fallback to the next procedure in the chain |
| // by calling ResolveUsingPrevious(). |
| // |
| // Note that implementations of HostResolverProc *MUST BE THREADSAFE*, since |
| // the HostResolver implementation using them can be multi-threaded. |
| class NET_EXPORT HostResolverProc |
| : public base::RefCountedThreadSafe<HostResolverProc> { |
| public: |
| explicit HostResolverProc(HostResolverProc* previous); |
| |
| // Resolves |host| to an address list, restricting the results to addresses |
| // in |address_family|. If successful returns OK and fills |addrlist| with |
| // a list of socket addresses. Otherwise returns a network error code, and |
| // fills |os_error| with a more specific error if it was non-NULL. |
| virtual int Resolve(const std::string& host, |
| AddressFamily address_family, |
| HostResolverFlags host_resolver_flags, |
| AddressList* addrlist, |
| int* os_error) = 0; |
| |
| protected: |
| friend class base::RefCountedThreadSafe<HostResolverProc>; |
| |
| virtual ~HostResolverProc(); |
| |
| // Asks the fallback procedure (if set) to do the resolve. |
| int ResolveUsingPrevious(const std::string& host, |
| AddressFamily address_family, |
| HostResolverFlags host_resolver_flags, |
| AddressList* addrlist, |
| int* os_error); |
| |
| private: |
| friend class HostResolverImpl; |
| friend class MockHostResolverBase; |
| friend class ScopedDefaultHostResolverProc; |
| |
| // Sets the previous procedure in the chain. Aborts if this would result in a |
| // cycle. |
| void SetPreviousProc(HostResolverProc* proc); |
| |
| // Sets the last procedure in the chain, i.e. appends |proc| to the end of the |
| // current chain. Aborts if this would result in a cycle. |
| void SetLastProc(HostResolverProc* proc); |
| |
| // Returns the last procedure in the chain starting at |proc|. Will return |
| // NULL iff |proc| is NULL. |
| static HostResolverProc* GetLastProc(HostResolverProc* proc); |
| |
| // Sets the default host resolver procedure that is used by HostResolverImpl. |
| // This can be used through ScopedDefaultHostResolverProc to set a catch-all |
| // DNS block in unit-tests (individual tests should use MockHostResolver to |
| // prevent hitting the network). |
| static HostResolverProc* SetDefault(HostResolverProc* proc); |
| static HostResolverProc* GetDefault(); |
| |
| scoped_refptr<HostResolverProc> previous_proc_; |
| static HostResolverProc* default_proc_; |
| |
| DISALLOW_COPY_AND_ASSIGN(HostResolverProc); |
| }; |
| |
| // Resolves |host| to an address list, using the system's default host resolver. |
| // (i.e. this calls out to getaddrinfo()). If successful returns OK and fills |
| // |addrlist| with a list of socket addresses. Otherwise returns a |
| // network error code, and fills |os_error| with a more specific error if it |
| // was non-NULL. |
| NET_EXPORT_PRIVATE int SystemHostResolverCall( |
| const std::string& host, |
| AddressFamily address_family, |
| HostResolverFlags host_resolver_flags, |
| AddressList* addrlist, |
| int* os_error); |
| |
| // Wraps call to SystemHostResolverCall as an instance of HostResolverProc. |
| class NET_EXPORT_PRIVATE SystemHostResolverProc : public HostResolverProc { |
| public: |
| SystemHostResolverProc(); |
| int Resolve(const std::string& hostname, |
| AddressFamily address_family, |
| HostResolverFlags host_resolver_flags, |
| AddressList* addr_list, |
| int* os_error) override; |
| |
| protected: |
| ~SystemHostResolverProc() override; |
| |
| DISALLOW_COPY_AND_ASSIGN(SystemHostResolverProc); |
| }; |
| |
| } // namespace net |
| |
| #endif // NET_DNS_HOST_RESOLVER_PROC_H_ |