1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2010 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/host_port_pair.h"
63345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/string_util.h"
83345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/stringprintf.h"
93345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "googleurl/src/gurl.h"
10dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "net/base/net_util.h"
11dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "net/base/sys_addrinfo.h"
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace net {
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
153345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickHostPortPair::HostPortPair() : port_(0) {}
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochHostPortPair::HostPortPair(const std::string& in_host, uint16 in_port)
173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    : host_(in_host), port_(in_port) {}
183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// static
203345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickHostPortPair HostPortPair::FromURL(const GURL& url) {
213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return HostPortPair(url.HostNoBrackets(), url.EffectiveIntPort());
223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
24dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// static
25dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenHostPortPair HostPortPair::FromAddrInfo(const struct addrinfo* ai) {
26dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return HostPortPair(NetAddressToString(ai),
27dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                      GetPortFromSockaddr(ai->ai_addr, ai->ai_addrlen));
28dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
29dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstd::string HostPortPair::ToString() const {
313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return base::StringPrintf("%s:%u", HostForURL().c_str(), port_);
323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickstd::string HostPortPair::HostForURL() const {
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Check to see if the host is an IPv6 address.  If so, added brackets.
363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (host_.find(':') != std::string::npos) {
373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    DCHECK_NE(host_[0], '[');
383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return base::StringPrintf("[%s]", host_.c_str());
393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return host_;
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace net
45