1 /* 2 * Copyright 2004 The WebRTC Project Authors. All rights reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #ifndef WEBRTC_P2P_CLIENT_HTTPPORTALLOCATOR_H_ 12 #define WEBRTC_P2P_CLIENT_HTTPPORTALLOCATOR_H_ 13 14 #include <list> 15 #include <string> 16 #include <vector> 17 18 #include "webrtc/p2p/client/basicportallocator.h" 19 20 class HttpPortAllocatorTest_TestSessionRequestUrl_Test; 21 22 namespace rtc { 23 class AsyncHttpRequest; 24 class SignalThread; 25 } 26 27 namespace cricket { 28 29 // TODO(pthatcher): Remove this. It's only used by chromoting, so we 30 // should just move this code there. It's used in these places in 31 // chromium: 32 // src/remoting/protocol/chromium_port_allocator.cc 33 // src/remoting/client/plugin/pepper_port_allocator.cc 34 // src/remoting/protocol/libjingle_transport_factory.cc 35 class HttpPortAllocatorBase : public BasicPortAllocator { 36 public: 37 // The number of HTTP requests we should attempt before giving up. 38 static const int kNumRetries; 39 40 // Records the URL that we will GET in order to create a session. 41 static const char kCreateSessionURL[]; 42 43 HttpPortAllocatorBase(rtc::NetworkManager* network_manager, 44 const std::string& user_agent); 45 HttpPortAllocatorBase(rtc::NetworkManager* network_manager, 46 rtc::PacketSocketFactory* socket_factory, 47 const std::string& user_agent); 48 virtual ~HttpPortAllocatorBase(); 49 50 // CreateSession is defined in BasicPortAllocator but is 51 // redefined here as pure virtual. 52 virtual PortAllocatorSession* CreateSessionInternal( 53 const std::string& content_name, 54 int component, 55 const std::string& ice_ufrag, 56 const std::string& ice_pwd) = 0; 57 SetStunHosts(const std::vector<rtc::SocketAddress> & hosts)58 void SetStunHosts(const std::vector<rtc::SocketAddress>& hosts) { 59 if (!hosts.empty()) { 60 stun_hosts_ = hosts; 61 } 62 } SetRelayHosts(const std::vector<std::string> & hosts)63 void SetRelayHosts(const std::vector<std::string>& hosts) { 64 if (!hosts.empty()) { 65 relay_hosts_ = hosts; 66 } 67 } SetRelayToken(const std::string & relay)68 void SetRelayToken(const std::string& relay) { relay_token_ = relay; } 69 stun_hosts()70 const std::vector<rtc::SocketAddress>& stun_hosts() const { 71 return stun_hosts_; 72 } 73 relay_hosts()74 const std::vector<std::string>& relay_hosts() const { 75 return relay_hosts_; 76 } 77 relay_token()78 const std::string& relay_token() const { 79 return relay_token_; 80 } 81 user_agent()82 const std::string& user_agent() const { 83 return agent_; 84 } 85 86 private: 87 std::vector<rtc::SocketAddress> stun_hosts_; 88 std::vector<std::string> relay_hosts_; 89 std::string relay_token_; 90 std::string agent_; 91 }; 92 93 class RequestData; 94 95 class HttpPortAllocatorSessionBase : public BasicPortAllocatorSession { 96 public: 97 HttpPortAllocatorSessionBase( 98 HttpPortAllocatorBase* allocator, 99 const std::string& content_name, 100 int component, 101 const std::string& ice_ufrag, 102 const std::string& ice_pwd, 103 const std::vector<rtc::SocketAddress>& stun_hosts, 104 const std::vector<std::string>& relay_hosts, 105 const std::string& relay, 106 const std::string& agent); 107 virtual ~HttpPortAllocatorSessionBase(); 108 relay_token()109 const std::string& relay_token() const { 110 return relay_token_; 111 } 112 user_agent()113 const std::string& user_agent() const { 114 return agent_; 115 } 116 117 virtual void SendSessionRequest(const std::string& host, int port) = 0; 118 virtual void ReceiveSessionResponse(const std::string& response); 119 120 // Made public for testing. Should be protected. 121 std::string GetSessionRequestUrl(); 122 123 protected: 124 virtual void GetPortConfigurations(); 125 void TryCreateRelaySession(); allocator()126 virtual HttpPortAllocatorBase* allocator() { 127 return static_cast<HttpPortAllocatorBase*>( 128 BasicPortAllocatorSession::allocator()); 129 } 130 131 private: 132 std::vector<std::string> relay_hosts_; 133 std::vector<rtc::SocketAddress> stun_hosts_; 134 std::string relay_token_; 135 std::string agent_; 136 int attempts_; 137 }; 138 139 } // namespace cricket 140 141 #endif // WEBRTC_P2P_CLIENT_HTTPPORTALLOCATOR_H_ 142