mirror of
https://github.com/mii443/libdatachannel.git
synced 2025-08-24 16:09:22 +00:00
Merge pull request #278 from hhgyu/add-support-protocols
support Subprotocols
This commit is contained in:
@ -49,6 +49,7 @@ public:
|
|||||||
|
|
||||||
struct Configuration {
|
struct Configuration {
|
||||||
bool disableTlsVerification = false; // if true, don't verify the TLS certificate
|
bool disableTlsVerification = false; // if true, don't verify the TLS certificate
|
||||||
|
std::optional<std::vector<string>> protocols = std::nullopt;
|
||||||
};
|
};
|
||||||
|
|
||||||
WebSocket(std::optional<Configuration> config = nullopt);
|
WebSocket(std::optional<Configuration> config = nullopt);
|
||||||
|
@ -291,7 +291,14 @@ shared_ptr<WsTransport> WebSocket::initWsTransport() {
|
|||||||
shared_ptr<Transport> lower = std::atomic_load(&mTlsTransport);
|
shared_ptr<Transport> lower = std::atomic_load(&mTlsTransport);
|
||||||
if (!lower)
|
if (!lower)
|
||||||
lower = std::atomic_load(&mTcpTransport);
|
lower = std::atomic_load(&mTcpTransport);
|
||||||
|
|
||||||
|
auto wsConfig = WsTransport::Configuration();
|
||||||
|
if(mConfig.protocols) {
|
||||||
|
wsConfig.protocols = *mConfig.protocols;
|
||||||
|
}
|
||||||
|
|
||||||
auto transport = std::make_shared<WsTransport>(
|
auto transport = std::make_shared<WsTransport>(
|
||||||
|
wsConfig,
|
||||||
lower, mHost, mPath, weak_bind(&WebSocket::incoming, this, _1),
|
lower, mHost, mPath, weak_bind(&WebSocket::incoming, this, _1),
|
||||||
[this, weak_this = weak_from_this()](State state) {
|
[this, weak_this = weak_from_this()](State state) {
|
||||||
auto shared_this = weak_this.lock();
|
auto shared_this = weak_this.lock();
|
||||||
|
@ -29,6 +29,7 @@
|
|||||||
#include <map>
|
#include <map>
|
||||||
#include <random>
|
#include <random>
|
||||||
#include <regex>
|
#include <regex>
|
||||||
|
#include <numeric>
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
#include <winsock2.h>
|
#include <winsock2.h>
|
||||||
@ -53,9 +54,9 @@ using std::to_string;
|
|||||||
using random_bytes_engine =
|
using random_bytes_engine =
|
||||||
std::independent_bits_engine<std::default_random_engine, CHAR_BIT, unsigned short>;
|
std::independent_bits_engine<std::default_random_engine, CHAR_BIT, unsigned short>;
|
||||||
|
|
||||||
WsTransport::WsTransport(std::shared_ptr<Transport> lower, string host, string path,
|
WsTransport::WsTransport(std::optional<Configuration> config, std::shared_ptr<Transport> lower, string host, string path,
|
||||||
message_callback recvCallback, state_callback stateCallback)
|
message_callback recvCallback, state_callback stateCallback)
|
||||||
: Transport(lower, std::move(stateCallback)), mHost(std::move(host)), mPath(std::move(path)) {
|
: Transport(lower, std::move(stateCallback)), mHost(std::move(host)), mPath(std::move(path)), mConfig(config ? std::move(*config) : Configuration()) {
|
||||||
onRecv(recvCallback);
|
onRecv(recvCallback);
|
||||||
|
|
||||||
PLOG_DEBUG << "Initializing WebSocket transport";
|
PLOG_DEBUG << "Initializing WebSocket transport";
|
||||||
@ -164,6 +165,15 @@ bool WsTransport::sendHttpRequest() {
|
|||||||
auto k = reinterpret_cast<uint8_t *>(key.data());
|
auto k = reinterpret_cast<uint8_t *>(key.data());
|
||||||
std::generate(k, k + key.size(), [&]() { return uint8_t(generator()); });
|
std::generate(k, k + key.size(), [&]() { return uint8_t(generator()); });
|
||||||
|
|
||||||
|
string appendHeader = "";
|
||||||
|
if(mConfig.protocols.size() > 0) {
|
||||||
|
appendHeader += "Sec-WebSocket-Protocol: " +
|
||||||
|
std::accumulate(mConfig.protocols.begin(), mConfig.protocols.end(), string(), [](const string& a, const string& b) -> string {
|
||||||
|
return a + (a.length() > 0 ? "," : "") + b;
|
||||||
|
}) +
|
||||||
|
"\r\n";
|
||||||
|
}
|
||||||
|
|
||||||
const string request = "GET " + mPath +
|
const string request = "GET " + mPath +
|
||||||
" HTTP/1.1\r\n"
|
" HTTP/1.1\r\n"
|
||||||
"Host: " +
|
"Host: " +
|
||||||
@ -174,7 +184,8 @@ bool WsTransport::sendHttpRequest() {
|
|||||||
"Sec-WebSocket-Version: 13\r\n"
|
"Sec-WebSocket-Version: 13\r\n"
|
||||||
"Sec-WebSocket-Key: " +
|
"Sec-WebSocket-Key: " +
|
||||||
to_base64(key) +
|
to_base64(key) +
|
||||||
"\r\n"
|
"\r\n" +
|
||||||
|
std::move(appendHeader) +
|
||||||
"\r\n";
|
"\r\n";
|
||||||
|
|
||||||
auto data = reinterpret_cast<const byte *>(request.data());
|
auto data = reinterpret_cast<const byte *>(request.data());
|
||||||
|
@ -31,7 +31,11 @@ class TlsTransport;
|
|||||||
|
|
||||||
class WsTransport : public Transport {
|
class WsTransport : public Transport {
|
||||||
public:
|
public:
|
||||||
WsTransport(std::shared_ptr<Transport> lower, string host, string path,
|
struct Configuration {
|
||||||
|
std::vector<string> protocols;
|
||||||
|
};
|
||||||
|
|
||||||
|
WsTransport(std::optional<Configuration> config, std::shared_ptr<Transport> lower, string host, string path,
|
||||||
message_callback recvCallback, state_callback stateCallback);
|
message_callback recvCallback, state_callback stateCallback);
|
||||||
~WsTransport();
|
~WsTransport();
|
||||||
|
|
||||||
@ -74,6 +78,8 @@ private:
|
|||||||
binary mBuffer;
|
binary mBuffer;
|
||||||
binary mPartial;
|
binary mPartial;
|
||||||
Opcode mPartialOpcode;
|
Opcode mPartialOpcode;
|
||||||
|
|
||||||
|
const Configuration mConfig;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace rtc
|
} // namespace rtc
|
||||||
|
Reference in New Issue
Block a user