diff options
| author | 2023-01-21 12:54:07 +0000 | |
|---|---|---|
| committer | 2023-01-21 12:54:07 +0000 | |
| commit | 7bd8091f6ba7e91baf078c414b1c94c2199d5b4a (patch) | |
| tree | 15648c5d2c57351649b10cc0809c6d6537d09b47 /src/modules/m_websocket.cpp | |
| parent | Log 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.cpp | 39 |
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; } |
