| Index: remoting/protocol/port_allocator.cc
|
| diff --git a/remoting/protocol/port_allocator_base.cc b/remoting/protocol/port_allocator.cc
|
| similarity index 69%
|
| rename from remoting/protocol/port_allocator_base.cc
|
| rename to remoting/protocol/port_allocator.cc
|
| index acc26c75cf76546dc943046380f5578bae598fc7..8f9a423062a6506064f8e5f62ee6486f53462e7c 100644
|
| --- a/remoting/protocol/port_allocator_base.cc
|
| +++ b/remoting/protocol/port_allocator.cc
|
| @@ -2,7 +2,7 @@
|
| // 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 "remoting/protocol/port_allocator.h"
|
|
|
| #include <algorithm>
|
| #include <map>
|
| @@ -12,6 +12,7 @@
|
| #include "base/strings/string_number_conversions.h"
|
| #include "base/strings/string_split.h"
|
| #include "net/base/escape.h"
|
| +#include "net/http/http_status_code.h"
|
| #include "remoting/protocol/network_settings.h"
|
| #include "remoting/protocol/transport_context.h"
|
|
|
| @@ -32,14 +33,14 @@ StringMap ParseMap(const std::string& string) {
|
| return map;
|
| }
|
|
|
| +const int kNumRetries = 5;
|
| +
|
| } // namespace
|
|
|
| namespace remoting {
|
| namespace protocol {
|
|
|
| -const int PortAllocatorBase::kNumRetries = 5;
|
| -
|
| -PortAllocatorBase::PortAllocatorBase(
|
| +PortAllocator::PortAllocator(
|
| scoped_ptr<rtc::NetworkManager> network_manager,
|
| scoped_ptr<rtc::PacketSocketFactory> socket_factory,
|
| scoped_refptr<TransportContext> transport_context)
|
| @@ -68,14 +69,22 @@ PortAllocatorBase::PortAllocatorBase(
|
| network_settings.port_range.max_port);
|
| }
|
|
|
| -PortAllocatorBase::~PortAllocatorBase() {}
|
| +PortAllocator::~PortAllocator() {}
|
|
|
| -PortAllocatorSessionBase::PortAllocatorSessionBase(
|
| - PortAllocatorBase* allocator,
|
| +cricket::PortAllocatorSession* PortAllocator::CreateSessionInternal(
|
| const std::string& content_name,
|
| int component,
|
| - const std::string& ice_ufrag,
|
| - const std::string& ice_pwd)
|
| + const std::string& ice_username_fragment,
|
| + const std::string& ice_password) {
|
| + return new PortAllocatorSession(this, content_name, component,
|
| + ice_username_fragment, ice_password);
|
| +}
|
| +
|
| +PortAllocatorSession::PortAllocatorSession(PortAllocator* allocator,
|
| + const std::string& content_name,
|
| + int component,
|
| + const std::string& ice_ufrag,
|
| + const std::string& ice_pwd)
|
| : BasicPortAllocatorSession(allocator,
|
| content_name,
|
| component,
|
| @@ -84,14 +93,14 @@ PortAllocatorSessionBase::PortAllocatorSessionBase(
|
| transport_context_(allocator->transport_context()),
|
| weak_factory_(this) {}
|
|
|
| -PortAllocatorSessionBase::~PortAllocatorSessionBase() {}
|
| +PortAllocatorSession::~PortAllocatorSession() {}
|
|
|
| -void PortAllocatorSessionBase::GetPortConfigurations() {
|
| +void PortAllocatorSession::GetPortConfigurations() {
|
| transport_context_->GetJingleInfo(base::Bind(
|
| - &PortAllocatorSessionBase::OnJingleInfo, weak_factory_.GetWeakPtr()));
|
| + &PortAllocatorSession::OnJingleInfo, weak_factory_.GetWeakPtr()));
|
| }
|
|
|
| -void PortAllocatorSessionBase::OnJingleInfo(
|
| +void PortAllocatorSession::OnJingleInfo(
|
| std::vector<rtc::SocketAddress> stun_hosts,
|
| std::vector<std::string> relay_hosts,
|
| std::string relay_token) {
|
| @@ -115,11 +124,11 @@ void PortAllocatorSessionBase::OnJingleInfo(
|
| TryCreateRelaySession();
|
| }
|
|
|
| -void PortAllocatorSessionBase::TryCreateRelaySession() {
|
| +void PortAllocatorSession::TryCreateRelaySession() {
|
| if (flags() & cricket::PORTALLOCATOR_DISABLE_RELAY)
|
| return;
|
|
|
| - if (attempts_ == PortAllocatorBase::kNumRetries) {
|
| + if (attempts_ == kNumRetries) {
|
| LOG(ERROR) << "PortAllocator: maximum number of requests reached; "
|
| << "giving up on relay.";
|
| return;
|
| @@ -138,20 +147,33 @@ void PortAllocatorSessionBase::TryCreateRelaySession() {
|
| // 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);
|
| + DCHECK(!username().empty());
|
| + DCHECK(!password().empty());
|
| + std::string url = "https://" + host + "/create_session?username=" +
|
| + net::EscapeUrlEncodedData(username(), false) +
|
| + "&password=" +
|
| + net::EscapeUrlEncodedData(password(), false) + "&sn=1";
|
| + scoped_ptr<UrlRequest> url_request =
|
| + transport_context_->url_request_factory()->CreateUrlRequest(url);
|
| + url_request->AddHeader("X-Talk-Google-Relay-Auth: " + relay_token());
|
| + url_request->AddHeader("X-Google-Relay-Auth: " + relay_token());
|
| + url_request->AddHeader("X-Stream-Type: chromoting");
|
| + url_request->Start(base::Bind(&PortAllocatorSession::OnSessionRequestResult,
|
| + base::Unretained(this)));
|
| + url_requests_.insert(std::move(url_request));
|
| }
|
|
|
| -void PortAllocatorSessionBase::ReceiveSessionResponse(
|
| - const std::string& response) {
|
| - StringMap map = ParseMap(response);
|
| +void PortAllocatorSession::OnSessionRequestResult(
|
| + const UrlRequest::Result& result) {
|
| + if (!result.success || result.status != net::HTTP_OK) {
|
| + LOG(WARNING) << "Received error when allocating relay session: "
|
| + << result.status;
|
| + TryCreateRelaySession();
|
| + return;
|
| + }
|
| +
|
| + StringMap map = ParseMap(result.response_body);
|
|
|
| if (!username().empty() && map["username"] != username()) {
|
| LOG(WARNING) << "Received unexpected username value from relay server.";
|
|
|