Browse Source

Proxy wstransport stack fix (#1)

Updating wstransport to accept http proxy in addition to tcp/tls transports.
web2098 2 years ago
parent
commit
072f4b466d
3 changed files with 13 additions and 4 deletions
  1. 8 1
      src/impl/websocket.cpp
  2. 3 2
      src/impl/wstransport.cpp
  3. 2 1
      src/impl/wstransport.hpp

+ 8 - 1
src/impl/websocket.cpp

@@ -379,12 +379,19 @@ shared_ptr<WsTransport> WebSocket::initWsTransport() {
 		if (auto transport = std::atomic_load(&mWsTransport))
 			return transport;
 
-		variant<shared_ptr<TcpTransport>, shared_ptr<TlsTransport>> lower;
+		variant<shared_ptr<TcpTransport>, shared_ptr<HttpProxyTransport>, shared_ptr<TlsTransport>> lower;
 		if (mIsSecure) {
 			auto transport = std::atomic_load(&mTlsTransport);
 			if (!transport)
 				throw std::logic_error("No underlying TLS transport for WebSocket transport");
 
+			lower = transport;
+		} 
+		else if (config.proxyServer) {
+			auto transport = std::atomic_load(&mProxyTransport);
+			if (!transport)
+				throw std::logic_error("No underlying proxy transport for WebSocket transport");
+
 			lower = transport;
 		} else {
 			auto transport = std::atomic_load(&mTcpTransport);

+ 3 - 2
src/impl/wstransport.cpp

@@ -7,6 +7,7 @@
  */
 
 #include "wstransport.hpp"
+#include "httpproxytransport.hpp"
 #include "tcptransport.hpp"
 #include "threadpool.hpp"
 #include "tlstransport.hpp"
@@ -42,14 +43,14 @@ using std::to_integer;
 using std::to_string;
 using std::chrono::system_clock;
 
-WsTransport::WsTransport(variant<shared_ptr<TcpTransport>, shared_ptr<TlsTransport>> lower,
+WsTransport::WsTransport(variant<shared_ptr<TcpTransport>, shared_ptr<HttpProxyTransport>, shared_ptr<TlsTransport>> lower,
                          shared_ptr<WsHandshake> handshake, int maxOutstandingPings,
                          message_callback recvCallback, state_callback stateCallback)
     : Transport(std::visit([](auto l) { return std::static_pointer_cast<Transport>(l); }, lower),
                 std::move(stateCallback)),
       mHandshake(std::move(handshake)),
       mIsClient(
-          std::visit(rtc::overloaded{[](shared_ptr<TcpTransport> l) { return l->isActive(); },
+          std::visit(rtc::overloaded{[](auto l) { return l->isActive(); },
                                      [](shared_ptr<TlsTransport> l) { return l->isClient(); }},
                      lower)),
       mMaxOutstandingPings(maxOutstandingPings) {

+ 2 - 1
src/impl/wstransport.hpp

@@ -19,12 +19,13 @@
 
 namespace rtc::impl {
 
+class HttpProxyTransport;
 class TcpTransport;
 class TlsTransport;
 
 class WsTransport final : public Transport, public std::enable_shared_from_this<WsTransport> {
 public:
-	WsTransport(variant<shared_ptr<TcpTransport>, shared_ptr<TlsTransport>> lower,
+	WsTransport(variant<shared_ptr<TcpTransport>, shared_ptr<HttpProxyTransport>, shared_ptr<TlsTransport>> lower,
 	            shared_ptr<WsHandshake> handshake, int maxOutstandingPings,
 	            message_callback recvCallback, state_callback stateCallback);
 	~WsTransport();