aboutsummaryrefslogtreecommitdiff
path: root/src/modules/m_websocket.cpp
diff options
context:
space:
mode:
authorGravatar Sadie Powell2023-01-21 12:54:07 +0000
committerGravatar Sadie Powell2023-01-21 12:54:07 +0000
commit7bd8091f6ba7e91baf078c414b1c94c2199d5b4a (patch)
tree15648c5d2c57351649b10cc0809c6d6537d09b47 /src/modules/m_websocket.cpp
parentLog the versions of third-party libraries used by modules. (diff)
Use the underlying transport method for pinging idle clients.
Closes #1998.
Diffstat (limited to 'src/modules/m_websocket.cpp')
-rw-r--r--src/modules/m_websocket.cpp39
1 files changed, 33 insertions, 6 deletions
diff --git a/src/modules/m_websocket.cpp b/src/modules/m_websocket.cpp
index 298aa5f8d..062a3522d 100644
--- a/src/modules/m_websocket.cpp
+++ b/src/modules/m_websocket.cpp
@@ -56,6 +56,9 @@ struct WebSocketConfig final
// The IP ranges which send trustworthy X-Real-IP or X-Forwarded-For headers.
ProxyRanges proxyranges;
+
+ // Whether to send WebSocket ping messages instead of IRC ping messages.
+ bool nativeping;
};
class WebSocketHookProvider final
@@ -276,15 +279,23 @@ class WebSocketHook final
std::string appdata;
const int result = HandleAppData(sock, appdata, false);
- // If it's a pong stop here regardless of the result so we won't generate a reply
- if ((result <= 0) || (!isping))
+ if (result <= 0)
return result;
- StreamSocket::SendQueue::Element elem = PrepareSendQElem(appdata.length(), OP_PONG);
- elem.append(appdata);
- GetSendQ().push_back(elem);
+ if (isping)
+ {
+ StreamSocket::SendQueue::Element elem = PrepareSendQElem(appdata.length(), OP_PONG);
+ elem.append(appdata);
+ GetSendQ().push_back(elem);
- SocketEngine::ChangeEventMask(sock, FD_ADD_TRIAL_WRITE);
+ SocketEngine::ChangeEventMask(sock, FD_ADD_TRIAL_WRITE);
+ }
+ else if (sock->type == StreamSocket::SS_USER && config.nativeping)
+ {
+ // Pong reply on user socket; reset their idle time.
+ UserIOHandler* ioh = static_cast<UserIOHandler*>(sock);
+ ioh->user->lastping = 1;
+ }
return 1;
}
@@ -584,6 +595,20 @@ public:
void OnStreamSocketClose(StreamSocket* sock) override
{
}
+
+ bool Ping() override
+ {
+ if (!config.nativeping)
+ return false;
+
+ StreamSocket::SendQueue& mysendq = GetSendQ();
+
+ const std::string& message = ServerInstance->Config->GetServerName();
+ mysendq.push_back(PrepareSendQElem(message.length(), OP_PING));
+ mysendq.push_back(message);
+
+ return true;
+ }
};
void WebSocketHookProvider::OnAccept(StreamSocket* sock, const irc::sockets::sockaddrs& client, const irc::sockets::sockaddrs& server)
@@ -640,6 +665,8 @@ public:
for (std::string proxyrange; proxyranges.GetToken(proxyrange); )
config.proxyranges.push_back(proxyrange);
+ config.nativeping = tag->getBool("nativeping", true);
+
// Everything is okay; apply the new config.
hookprov->config = config;
}