• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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