mirror of
https://github.com/mii443/libdatachannel.git
synced 2025-08-23 23:49:21 +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 {
|
||||
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);
|
||||
|
@ -291,7 +291,14 @@ shared_ptr<WsTransport> WebSocket::initWsTransport() {
|
||||
shared_ptr<Transport> lower = std::atomic_load(&mTlsTransport);
|
||||
if (!lower)
|
||||
lower = std::atomic_load(&mTcpTransport);
|
||||
|
||||
auto wsConfig = WsTransport::Configuration();
|
||||
if(mConfig.protocols) {
|
||||
wsConfig.protocols = *mConfig.protocols;
|
||||
}
|
||||
|
||||
auto transport = std::make_shared<WsTransport>(
|
||||
wsConfig,
|
||||
lower, mHost, mPath, weak_bind(&WebSocket::incoming, this, _1),
|
||||
[this, weak_this = weak_from_this()](State state) {
|
||||
auto shared_this = weak_this.lock();
|
||||
|
@ -29,6 +29,7 @@
|
||||
#include <map>
|
||||
#include <random>
|
||||
#include <regex>
|
||||
#include <numeric>
|
||||
|
||||
#ifdef _WIN32
|
||||
#include <winsock2.h>
|
||||
@ -53,9 +54,9 @@ using std::to_string;
|
||||
using random_bytes_engine =
|
||||
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)
|
||||
: 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);
|
||||
|
||||
PLOG_DEBUG << "Initializing WebSocket transport";
|
||||
@ -164,6 +165,15 @@ bool WsTransport::sendHttpRequest() {
|
||||
auto k = reinterpret_cast<uint8_t *>(key.data());
|
||||
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 +
|
||||
" HTTP/1.1\r\n"
|
||||
"Host: " +
|
||||
@ -174,7 +184,8 @@ bool WsTransport::sendHttpRequest() {
|
||||
"Sec-WebSocket-Version: 13\r\n"
|
||||
"Sec-WebSocket-Key: " +
|
||||
to_base64(key) +
|
||||
"\r\n"
|
||||
"\r\n" +
|
||||
std::move(appendHeader) +
|
||||
"\r\n";
|
||||
|
||||
auto data = reinterpret_cast<const byte *>(request.data());
|
||||
|
@ -31,7 +31,11 @@ class TlsTransport;
|
||||
|
||||
class WsTransport : public Transport {
|
||||
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);
|
||||
~WsTransport();
|
||||
|
||||
@ -74,6 +78,8 @@ private:
|
||||
binary mBuffer;
|
||||
binary mPartial;
|
||||
Opcode mPartialOpcode;
|
||||
|
||||
const Configuration mConfig;
|
||||
};
|
||||
|
||||
} // namespace rtc
|
||||
|
Reference in New Issue
Block a user