|
@@ -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, std::optional<int> maxOutstandingPings)
|
|
|
: 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(maxOutstandingPings) {
|
|
|
|
|
|
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});
|
|
|
-
|
|
|
+ addOutstandingPing();
|
|
|
} else {
|
|
|
Frame frame;
|
|
|
while (size_t len = readFrame(mBuffer.data(), mBuffer.size(), frame)) {
|
|
@@ -317,6 +318,7 @@ void WsTransport::recvFrame(const Frame &frame) {
|
|
|
}
|
|
|
case PONG: {
|
|
|
PLOG_DEBUG << "WebSocket received pong";
|
|
|
+ mPingsOutstanding = 0;
|
|
|
break;
|
|
|
}
|
|
|
case CLOSE: {
|
|
@@ -371,6 +373,13 @@ bool WsTransport::sendFrame(const Frame &frame) {
|
|
|
return outgoing(make_message(frame.payload, frame.payload + frame.length)); // payload
|
|
|
}
|
|
|
|
|
|
+void WsTransport::addOutstandingPing() {
|
|
|
+ ++mPingsOutstanding;
|
|
|
+ if (mMaxPongsMissed && *mMaxPongsMissed > 0 && mPingsOutstanding > *mMaxPongsMissed) {
|
|
|
+ changeState(State::Failed);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
} // namespace rtc::impl
|
|
|
|
|
|
#endif
|