|
@@ -7,7 +7,7 @@
|
|
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
|
*/
|
|
|
|
|
|
-#include "tcpproxytransport.hpp"
|
|
|
+#include "httpproxytransport.hpp"
|
|
|
#include "tcptransport.hpp"
|
|
|
#include "utils.hpp"
|
|
|
|
|
@@ -18,41 +18,43 @@ namespace rtc::impl {
|
|
|
using std::to_string;
|
|
|
using std::chrono::system_clock;
|
|
|
|
|
|
-TcpProxyTransport::TcpProxyTransport(shared_ptr<TcpTransport> lower, std::string hostname, std::string service, state_callback stateCallback)
|
|
|
+HttpProxyTransport::HttpProxyTransport(shared_ptr<TcpTransport> lower, std::string hostname, std::string service, state_callback stateCallback)
|
|
|
: Transport(lower, std::move(stateCallback))
|
|
|
- , mIsActive( lower->isActive() )
|
|
|
, mHostname( std::move(hostname) )
|
|
|
, mService( std::move(service) )
|
|
|
{
|
|
|
- PLOG_DEBUG << "Initializing TCP Proxy transport";
|
|
|
+ if (!lower->isActive())
|
|
|
+ throw std::logic_error("Http proxy creation failed, expects lower transport to be active");
|
|
|
+
|
|
|
+ PLOG_DEBUG << "Initializing http Proxy transport";
|
|
|
}
|
|
|
|
|
|
-TcpProxyTransport::~TcpProxyTransport() { unregisterIncoming(); }
|
|
|
+HttpProxyTransport::~HttpProxyTransport() { unregisterIncoming(); }
|
|
|
|
|
|
-void TcpProxyTransport::start() {
|
|
|
+void HttpProxyTransport::start() {
|
|
|
registerIncoming();
|
|
|
|
|
|
changeState(State::Connecting);
|
|
|
sendHttpRequest();
|
|
|
}
|
|
|
|
|
|
-void TcpProxyTransport::stop() {
|
|
|
+void HttpProxyTransport::stop() {
|
|
|
unregisterIncoming();
|
|
|
}
|
|
|
|
|
|
-bool TcpProxyTransport::send(message_ptr message) {
|
|
|
+bool HttpProxyTransport::send(message_ptr message) {
|
|
|
std::lock_guard lock(mSendMutex);
|
|
|
|
|
|
if (state() != State::Connected)
|
|
|
- throw std::runtime_error("Tcp proxy connection is not open");
|
|
|
+ throw std::runtime_error("Http proxy connection is not open");
|
|
|
|
|
|
PLOG_VERBOSE << "Send size=" << message->size();
|
|
|
return outgoing(message);
|
|
|
}
|
|
|
|
|
|
-bool TcpProxyTransport::isActive() const { return mIsActive; }
|
|
|
+bool HttpProxyTransport::isActive() const { return true; }
|
|
|
|
|
|
-void TcpProxyTransport::incoming(message_ptr message) {
|
|
|
+void HttpProxyTransport::incoming(message_ptr message) {
|
|
|
auto s = state();
|
|
|
if (s != State::Connecting && s != State::Connected)
|
|
|
return; // Drop
|
|
@@ -61,13 +63,18 @@ void TcpProxyTransport::incoming(message_ptr message) {
|
|
|
PLOG_VERBOSE << "Incoming size=" << message->size();
|
|
|
|
|
|
try {
|
|
|
- mBuffer.insert(mBuffer.end(), message->begin(), message->end());
|
|
|
-
|
|
|
if (state() == State::Connecting) {
|
|
|
+ mBuffer.insert(mBuffer.end(), message->begin(), message->end());
|
|
|
if (size_t len = parseHttpResponse(mBuffer.data(), mBuffer.size())) {
|
|
|
- PLOG_INFO << "Tcp proxy connection open";
|
|
|
+ PLOG_INFO << "Http proxy connection open";
|
|
|
changeState(State::Connected);
|
|
|
mBuffer.erase(mBuffer.begin(), mBuffer.begin() + len);
|
|
|
+
|
|
|
+ if( !mBuffer.empty() )
|
|
|
+ {
|
|
|
+ recv(make_message(mBuffer));
|
|
|
+ mBuffer.clear();
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
else if (state() == State::Connected)
|
|
@@ -82,24 +89,24 @@ void TcpProxyTransport::incoming(message_ptr message) {
|
|
|
}
|
|
|
|
|
|
if (state() == State::Connected) {
|
|
|
- PLOG_INFO << "TCP Proxy disconnected";
|
|
|
+ PLOG_INFO << "Http Proxy disconnected";
|
|
|
changeState(State::Disconnected);
|
|
|
recv(nullptr);
|
|
|
} else {
|
|
|
- PLOG_ERROR << "TCP Proxy failed";
|
|
|
+ PLOG_ERROR << "Http Proxy failed";
|
|
|
changeState(State::Failed);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-bool TcpProxyTransport::sendHttpRequest() {
|
|
|
- PLOG_DEBUG << "Sending TcpProxy HTTP request";
|
|
|
+bool HttpProxyTransport::sendHttpRequest() {
|
|
|
+ PLOG_DEBUG << "Sending proxy http request";
|
|
|
|
|
|
const string request = generateHttpRequest();
|
|
|
auto data = reinterpret_cast<const byte *>(request.data());
|
|
|
return outgoing(make_message(data, data + request.size()));
|
|
|
}
|
|
|
|
|
|
-std::string TcpProxyTransport::generateHttpRequest()
|
|
|
+std::string HttpProxyTransport::generateHttpRequest()
|
|
|
{
|
|
|
std::string out =
|
|
|
"CONNECT " +
|
|
@@ -109,7 +116,7 @@ std::string TcpProxyTransport::generateHttpRequest()
|
|
|
return out;
|
|
|
}
|
|
|
|
|
|
-size_t TcpProxyTransport::parseHttpResponse( std::byte* buffer, size_t size )
|
|
|
+size_t HttpProxyTransport::parseHttpResponse( std::byte* buffer, size_t size )
|
|
|
{
|
|
|
std::list<string> lines;
|
|
|
size_t length = utils::parseHttpLines(buffer, size, lines);
|
|
@@ -117,7 +124,7 @@ size_t TcpProxyTransport::parseHttpResponse( std::byte* buffer, size_t size )
|
|
|
return 0;
|
|
|
|
|
|
if (lines.empty())
|
|
|
- throw std::runtime_error("Invalid HTTP request for Tcp Proxy");
|
|
|
+ throw std::runtime_error("Invalid http request for proxy");
|
|
|
|
|
|
std::istringstream status(std::move(lines.front()));
|
|
|
lines.pop_front();
|
|
@@ -127,7 +134,7 @@ size_t TcpProxyTransport::parseHttpResponse( std::byte* buffer, size_t size )
|
|
|
status >> protocol >> code;
|
|
|
|
|
|
if (code != 200)
|
|
|
- throw std::runtime_error("Unexpected response code " + to_string(code) + " for Tcp Proxy");
|
|
|
+ throw std::runtime_error("Unexpected response code " + to_string(code) + " for proxy");
|
|
|
|
|
|
return length;
|
|
|
}
|