|
@@ -54,14 +54,15 @@ using random_bytes_engine =
|
|
|
|
|
|
WsTransport::WsTransport(variant<shared_ptr<TcpTransport>, shared_ptr<TlsTransport>> lower,
|
|
|
shared_ptr<WsHandshake> handshake, message_callback recvCallback,
|
|
|
- state_callback stateCallback)
|
|
|
+ state_callback stateCallback, int maxPongsMissed)
|
|
|
: 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(); },
|
|
|
[](shared_ptr<TlsTransport> l) { return l->isClient(); }},
|
|
|
- lower)) {
|
|
|
+ lower)),
|
|
|
+ mMaxPongsMissed(maxPongsMissed) {
|
|
|
|
|
|
onRecv(std::move(recvCallback));
|
|
|
|
|
@@ -132,7 +133,7 @@ void WsTransport::incoming(message_ptr message) {
|
|
|
PLOG_DEBUG << "WebSocket sending ping";
|
|
|
uint32_t dummy = 0;
|
|
|
sendFrame({PING, reinterpret_cast<byte *>(&dummy), 4, true, mIsClient});
|
|
|
-
|
|
|
+ addOpenPing();
|
|
|
} else {
|
|
|
Frame frame;
|
|
|
while (size_t len = readFrame(mBuffer.data(), mBuffer.size(), frame)) {
|
|
@@ -312,11 +313,14 @@ void WsTransport::recvFrame(const Frame &frame) {
|
|
|
}
|
|
|
case PING: {
|
|
|
PLOG_DEBUG << "WebSocket received ping, sending pong";
|
|
|
- sendFrame({PONG, frame.payload, frame.length, true, mIsClient});
|
|
|
+ if (!sendFrame({PONG, frame.payload, frame.length, true, mIsClient})) {
|
|
|
+ PLOG_ERROR << "WebSocket could not send ping";
|
|
|
+ }
|
|
|
break;
|
|
|
}
|
|
|
case PONG: {
|
|
|
PLOG_DEBUG << "WebSocket received pong";
|
|
|
+ mPingsOpen = 0;
|
|
|
break;
|
|
|
}
|
|
|
case CLOSE: {
|
|
@@ -371,6 +375,13 @@ bool WsTransport::sendFrame(const Frame &frame) {
|
|
|
return outgoing(make_message(frame.payload, frame.payload + frame.length)); // payload
|
|
|
}
|
|
|
|
|
|
+void WsTransport::addOpenPing() {
|
|
|
+ ++mPingsOpen;
|
|
|
+ if (mMaxPongsMissed > 0 && mPingsOpen > mMaxPongsMissed) {
|
|
|
+ changeState(State::Failed);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
} // namespace rtc::impl
|
|
|
|
|
|
#endif
|