text: // 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_BASE_MAPPED_HOST_RESOLVER_H_
  #define NET_BASE_MAPPED_HOST_RESOLVER_H_
  
  #include <string>
  
  #include "base/memory/scoped_ptr.h"
  #include "net/base/host_mapping_rules.h"
  #include "net/base/host_resolver.h"
  #include "net/base/net_export.h"
  
  namespace net {
  
  // This class wraps an existing HostResolver instance, but modifies the
  // request before passing it off to |impl|. This is different from
  // MockHostResolver which does the remapping at the HostResolverProc
  // layer, so it is able to preserve the effectiveness of the cache.
  class NET_EXPORT MappedHostResolver : public HostResolver {
   public:
    // Creates a MappedHostResolver that forwards all of its requests through
    // |impl|.  It takes ownership of |impl|.
    explicit MappedHostResolver(HostResolver* impl);
    virtual ~MappedHostResolver();
  
    // Adds a rule to this mapper. The format of the rule can be one of:
    //
    //   "MAP" <hostname_pattern> <replacement_host> [":" <replacement_port>]
    //   "EXCLUDE" <hostname_pattern>
    //
    // The <replacement_host> can be either a hostname, or an IP address literal.
    //
    // Returns true if the rule was successfully parsed and added.
    bool AddRuleFromString(const std::string& rule_string) {
      return rules_.AddRuleFromString(rule_string);
    }
  
    // Takes a comma separated list of rules, and assigns them to this resolver.
    void SetRulesFromString(const std::string& rules_string) {
      rules_.SetRulesFromString(rules_string);
    }
  
    // HostResolver methods:
    virtual int Resolve(const RequestInfo& info,
                        AddressList* addresses,
                        const CompletionCallback& callback,
                        RequestHandle* out_req,
                        const BoundNetLog& net_log) OVERRIDE;
    virtual int ResolveFromCache(const RequestInfo& info,
                                 AddressList* addresses,
                                 const BoundNetLog& net_log) OVERRIDE;
    virtual void CancelRequest(RequestHandle req) OVERRIDE;
    virtual void ProbeIPv6Support() OVERRIDE;
    virtual HostCache* GetHostCache() OVERRIDE;
  
   private:
    // Modify the request |info| according to |rules_|.
    RequestInfo ApplyRules(const RequestInfo& info) const;
  
    scoped_ptr<HostResolver> impl_;
  
    HostMappingRules rules_;
  };
  
  }  // namespace net
  
  #endif  // NET_BASE_MAPPED_HOST_RESOLVER_H_
  