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)#include "net/dns/mapped_host_resolver.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/string_util.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/host_port_pair.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_util.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MappedHostResolver::MappedHostResolver(scoped_ptr<HostResolver> impl)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : impl_(impl.Pass()) {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MappedHostResolver::~MappedHostResolver() {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int MappedHostResolver::Resolve(const RequestInfo& original_info,
223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                RequestPriority priority,
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                AddressList* addresses,
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                const CompletionCallback& callback,
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                RequestHandle* out_req,
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                const BoundNetLog& net_log) {
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RequestInfo info = original_info;
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int rv = ApplyRules(&info);
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (rv != OK)
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return rv;
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return impl_->Resolve(info, priority, addresses, callback, out_req, net_log);
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int MappedHostResolver::ResolveFromCache(const RequestInfo& original_info,
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         AddressList* addresses,
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         const BoundNetLog& net_log) {
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RequestInfo info = original_info;
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int rv = ApplyRules(&info);
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (rv != OK)
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return rv;
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return impl_->ResolveFromCache(info, addresses, net_log);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MappedHostResolver::CancelRequest(RequestHandle req) {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  impl_->CancelRequest(req);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
500f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)void MappedHostResolver::SetDnsClientEnabled(bool enabled) {
510f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  impl_->SetDnsClientEnabled(enabled);
520f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)}
530f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HostCache* MappedHostResolver::GetHostCache() {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return impl_->GetHostCache();
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
580f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)base::Value* MappedHostResolver::GetDnsConfigAsValue() const {
590f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  return impl_->GetDnsConfigAsValue();
600f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)}
610f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int MappedHostResolver::ApplyRules(RequestInfo* info) const {
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  HostPortPair host_port(info->host_port_pair());
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (rules_.RewriteHost(&host_port)) {
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (host_port.host() == "~NOTFOUND")
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return ERR_NAME_NOT_RESOLVED;
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    info->set_host_port_pair(host_port);
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return OK;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
73