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_MAPPED_HOST_RESOLVER_H_
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define NET_DNS_MAPPED_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/host_mapping_rules.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_export.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/dns/host_resolver.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class wraps an existing HostResolver instance, but modifies the
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// request before passing it off to |impl|. This is different from
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MockHostResolver which does the remapping at the HostResolverProc
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// layer, so it is able to preserve the effectiveness of the cache.
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NET_EXPORT MappedHostResolver : public HostResolver {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates a MappedHostResolver that forwards all of its requests through
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |impl|.
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit MappedHostResolver(scoped_ptr<HostResolver> impl);
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~MappedHostResolver();
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adds a rule to this mapper. The format of the rule can be one of:
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   "MAP" <hostname_pattern> <replacement_host> [":" <replacement_port>]
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   "EXCLUDE" <hostname_pattern>
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The <replacement_host> can be either a hostname, or an IP address literal,
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // or "~NOTFOUND". If it is "~NOTFOUND" then all matched hostnames will fail
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // to be resolved with ERR_NAME_NOT_RESOLVED.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the rule was successfully parsed and added.
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool AddRuleFromString(const std::string& rule_string) {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return rules_.AddRuleFromString(rule_string);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Takes a comma separated list of rules, and assigns them to this resolver.
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetRulesFromString(const std::string& rules_string) {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rules_.SetRulesFromString(rules_string);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // HostResolver methods:
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int Resolve(const RequestInfo& info,
493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                      RequestPriority priority,
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      AddressList* addresses,
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const CompletionCallback& callback,
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      RequestHandle* out_req,
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const BoundNetLog& net_log) OVERRIDE;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int ResolveFromCache(const RequestInfo& info,
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               AddressList* addresses,
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               const BoundNetLog& net_log) OVERRIDE;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void CancelRequest(RequestHandle req) OVERRIDE;
580f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  virtual void SetDnsClientEnabled(bool enabled) OVERRIDE;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual HostCache* GetHostCache() OVERRIDE;
600f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  virtual base::Value* GetDnsConfigAsValue() const OVERRIDE;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Modify the request |info| according to |rules_|. Returns either OK or
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the network error code that the hostname's resolution mapped to.
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int ApplyRules(RequestInfo* info) const;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<HostResolver> impl_;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HostMappingRules rules_;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // NET_DNS_MAPPED_HOST_RESOLVER_H_
75