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)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/host_port_pair.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "base/logging.h"
85e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/string_number_conversions.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_split.h"
105e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/string_util.h"
115e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/stringprintf.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/ip_endpoint.h"
137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HostPortPair::HostPortPair() : port_(0) {}
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HostPortPair::HostPortPair(const std::string& in_host, uint16 in_port)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : host_(in_host), port_(in_port) {}
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HostPortPair HostPortPair::FromURL(const GURL& url) {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return HostPortPair(url.HostNoBrackets(), url.EffectiveIntPort());
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HostPortPair HostPortPair::FromIPEndPoint(const IPEndPoint& ipe) {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return HostPortPair(ipe.ToStringWithoutPort(), ipe.port());
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HostPortPair HostPortPair::FromString(const std::string& str) {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> key_port;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::SplitString(str, ':', &key_port);
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (key_port.size() != 2)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return HostPortPair();
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int port;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!base::StringToInt(key_port[1], &port))
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return HostPortPair();
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_LT(port, 1 << 16);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HostPortPair host_port_pair;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_port_pair.set_host(key_port[0]);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_port_pair.set_port(port);
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return host_port_pair;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string HostPortPair::ToString() const {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base::StringPrintf("%s:%u", HostForURL().c_str(), port_);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string HostPortPair::HostForURL() const {
51e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // TODO(rtenneti): Add support for |host| to have '\0'.
520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  if (host_.find('\0') != std::string::npos) {
530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    std::string host_for_log(host_);
540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    size_t nullpos;
550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    while ((nullpos = host_for_log.find('\0')) != std::string::npos) {
560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      host_for_log.replace(nullpos, 1, "%00");
570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    }
580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    LOG(DFATAL) << "Host has a null char: " << host_for_log;
590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check to see if the host is an IPv6 address.  If so, added brackets.
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (host_.find(':') != std::string::npos) {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK_NE(host_[0], '[');
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return base::StringPrintf("[%s]", host_.c_str());
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return host_;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
70