| Index: remoting/protocol/port_allocator_base.cc
 | 
| diff --git a/remoting/protocol/port_allocator_base.cc b/remoting/protocol/port_allocator_base.cc
 | 
| deleted file mode 100644
 | 
| index acc26c75cf76546dc943046380f5578bae598fc7..0000000000000000000000000000000000000000
 | 
| --- a/remoting/protocol/port_allocator_base.cc
 | 
| +++ /dev/null
 | 
| @@ -1,188 +0,0 @@
 | 
| -// Copyright 2016 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.
 | 
| -
 | 
| -#include "remoting/protocol/port_allocator_base.h"
 | 
| -
 | 
| -#include <algorithm>
 | 
| -#include <map>
 | 
| -
 | 
| -#include "base/bind.h"
 | 
| -#include "base/logging.h"
 | 
| -#include "base/strings/string_number_conversions.h"
 | 
| -#include "base/strings/string_split.h"
 | 
| -#include "net/base/escape.h"
 | 
| -#include "remoting/protocol/network_settings.h"
 | 
| -#include "remoting/protocol/transport_context.h"
 | 
| -
 | 
| -namespace {
 | 
| -
 | 
| -typedef std::map<std::string, std::string> StringMap;
 | 
| -
 | 
| -// Parses the lines in the result of the HTTP request that are of the form
 | 
| -// 'a=b' and returns them in a map.
 | 
| -StringMap ParseMap(const std::string& string) {
 | 
| -  StringMap map;
 | 
| -  base::StringPairs pairs;
 | 
| -  base::SplitStringIntoKeyValuePairs(string, '=', '\n', &pairs);
 | 
| -
 | 
| -  for (auto& pair : pairs) {
 | 
| -    map[pair.first] = pair.second;
 | 
| -  }
 | 
| -  return map;
 | 
| -}
 | 
| -
 | 
| -}  // namespace
 | 
| -
 | 
| -namespace remoting {
 | 
| -namespace protocol {
 | 
| -
 | 
| -const int PortAllocatorBase::kNumRetries = 5;
 | 
| -
 | 
| -PortAllocatorBase::PortAllocatorBase(
 | 
| -    scoped_ptr<rtc::NetworkManager> network_manager,
 | 
| -    scoped_ptr<rtc::PacketSocketFactory> socket_factory,
 | 
| -    scoped_refptr<TransportContext> transport_context)
 | 
| -    : BasicPortAllocator(network_manager.get(), socket_factory.get()),
 | 
| -      network_manager_(std::move(network_manager)),
 | 
| -      socket_factory_(std::move(socket_factory)),
 | 
| -      transport_context_(transport_context) {
 | 
| -  // We always use PseudoTcp to provide a reliable channel. It provides poor
 | 
| -  // performance when combined with TCP-based transport, so we have to disable
 | 
| -  // TCP ports. ENABLE_SHARED_UFRAG flag is specified so that the same username
 | 
| -  // fragment is shared between all candidates.
 | 
| -  int flags = cricket::PORTALLOCATOR_DISABLE_TCP |
 | 
| -              cricket::PORTALLOCATOR_ENABLE_SHARED_UFRAG |
 | 
| -              cricket::PORTALLOCATOR_ENABLE_IPV6;
 | 
| -
 | 
| -  NetworkSettings network_settings = transport_context_->network_settings();
 | 
| -
 | 
| -  if (!(network_settings.flags & NetworkSettings::NAT_TRAVERSAL_STUN))
 | 
| -    flags |= cricket::PORTALLOCATOR_DISABLE_STUN;
 | 
| -
 | 
| -  if (!(network_settings.flags & NetworkSettings::NAT_TRAVERSAL_RELAY))
 | 
| -    flags |= cricket::PORTALLOCATOR_DISABLE_RELAY;
 | 
| -
 | 
| -  set_flags(flags);
 | 
| -  SetPortRange(network_settings.port_range.min_port,
 | 
| -                       network_settings.port_range.max_port);
 | 
| -}
 | 
| -
 | 
| -PortAllocatorBase::~PortAllocatorBase() {}
 | 
| -
 | 
| -PortAllocatorSessionBase::PortAllocatorSessionBase(
 | 
| -    PortAllocatorBase* allocator,
 | 
| -    const std::string& content_name,
 | 
| -    int component,
 | 
| -    const std::string& ice_ufrag,
 | 
| -    const std::string& ice_pwd)
 | 
| -    : BasicPortAllocatorSession(allocator,
 | 
| -                                content_name,
 | 
| -                                component,
 | 
| -                                ice_ufrag,
 | 
| -                                ice_pwd),
 | 
| -      transport_context_(allocator->transport_context()),
 | 
| -      weak_factory_(this) {}
 | 
| -
 | 
| -PortAllocatorSessionBase::~PortAllocatorSessionBase() {}
 | 
| -
 | 
| -void PortAllocatorSessionBase::GetPortConfigurations() {
 | 
| -  transport_context_->GetJingleInfo(base::Bind(
 | 
| -      &PortAllocatorSessionBase::OnJingleInfo, weak_factory_.GetWeakPtr()));
 | 
| -}
 | 
| -
 | 
| -void PortAllocatorSessionBase::OnJingleInfo(
 | 
| -    std::vector<rtc::SocketAddress> stun_hosts,
 | 
| -    std::vector<std::string> relay_hosts,
 | 
| -    std::string relay_token) {
 | 
| -  stun_hosts_ = stun_hosts;
 | 
| -  relay_hosts_ = relay_hosts;
 | 
| -  relay_token_ = relay_token;
 | 
| -
 | 
| -  // Creating relay sessions can take time and is done asynchronously.
 | 
| -  // Creating stun sessions could also take time and could be done aysnc also,
 | 
| -  // but for now is done here and added to the initial config.  Note any later
 | 
| -  // configs will have unresolved stun ips and will be discarded by the
 | 
| -  // AllocationSequence.
 | 
| -  cricket::ServerAddresses hosts;
 | 
| -  for (const auto& host : stun_hosts_) {
 | 
| -    hosts.insert(host);
 | 
| -  }
 | 
| -
 | 
| -  cricket::PortConfiguration* config =
 | 
| -      new cricket::PortConfiguration(hosts, username(), password());
 | 
| -  ConfigReady(config);
 | 
| -  TryCreateRelaySession();
 | 
| -}
 | 
| -
 | 
| -void PortAllocatorSessionBase::TryCreateRelaySession() {
 | 
| -  if (flags() & cricket::PORTALLOCATOR_DISABLE_RELAY)
 | 
| -    return;
 | 
| -
 | 
| -  if (attempts_ == PortAllocatorBase::kNumRetries) {
 | 
| -    LOG(ERROR) << "PortAllocator: maximum number of requests reached; "
 | 
| -                  << "giving up on relay.";
 | 
| -    return;
 | 
| -  }
 | 
| -
 | 
| -  if (relay_hosts_.empty()) {
 | 
| -    LOG(ERROR) << "PortAllocator: no relay hosts configured.";
 | 
| -    return;
 | 
| -  }
 | 
| -
 | 
| -  if (relay_token_.empty()){
 | 
| -    LOG(WARNING) << "No relay auth token found.";
 | 
| -    return;
 | 
| -  }
 | 
| -
 | 
| -  // Choose the next host to try.
 | 
| -  std::string host = relay_hosts_[attempts_ % relay_hosts_.size()];
 | 
| -  attempts_++;
 | 
| -  SendSessionRequest(host);
 | 
| -}
 | 
| -
 | 
| -std::string PortAllocatorSessionBase::GetSessionRequestUrl() {
 | 
| -  ASSERT(!username().empty());
 | 
| -  ASSERT(!password().empty());
 | 
| -  return "/create_session?username=" +
 | 
| -         net::EscapeUrlEncodedData(username(), false) + "&password=" +
 | 
| -         net::EscapeUrlEncodedData(password(), false);
 | 
| -}
 | 
| -
 | 
| -void PortAllocatorSessionBase::ReceiveSessionResponse(
 | 
| -    const std::string& response) {
 | 
| -  StringMap map = ParseMap(response);
 | 
| -
 | 
| -  if (!username().empty() && map["username"] != username()) {
 | 
| -    LOG(WARNING) << "Received unexpected username value from relay server.";
 | 
| -  }
 | 
| -  if (!password().empty() && map["password"] != password()) {
 | 
| -    LOG(WARNING) << "Received unexpected password value from relay server.";
 | 
| -  }
 | 
| -
 | 
| -  cricket::ServerAddresses hosts;
 | 
| -  for (const auto& host : stun_hosts_) {
 | 
| -    hosts.insert(host);
 | 
| -  }
 | 
| -
 | 
| -  cricket::PortConfiguration* config =
 | 
| -      new cricket::PortConfiguration(hosts, map["username"], map["password"]);
 | 
| -
 | 
| -  std::string relay_ip = map["relay.ip"];
 | 
| -  std::string relay_port = map["relay.udp_port"];
 | 
| -  unsigned relay_port_int;
 | 
| -
 | 
| -  if (!relay_ip.empty() && !relay_port.empty() &&
 | 
| -      base::StringToUint(relay_port, &relay_port_int)) {
 | 
| -    cricket::RelayServerConfig relay_config(cricket::RELAY_GTURN);
 | 
| -    rtc::SocketAddress address(relay_ip, relay_port_int);
 | 
| -    relay_config.ports.push_back(
 | 
| -        cricket::ProtocolAddress(address, cricket::PROTO_UDP));
 | 
| -    config->AddRelay(relay_config);
 | 
| -  }
 | 
| -
 | 
| -  ConfigReady(config);
 | 
| -}
 | 
| -
 | 
| -}  // namespace protocol
 | 
| -}  // namespace remoting
 | 
| 
 |