From 0a4fcd44c2c69d46b0bbd39646e3e9e94d319d84 Mon Sep 17 00:00:00 2001 From: Links Date: Sun, 31 Jan 2021 10:27:36 +0100 Subject: [PATCH] EIO=4 ping handling #611 --- src/SocketIOclient.cpp | 24 +++++++++++++++++++++--- src/SocketIOclient.h | 5 +++++ src/WebSocketsClient.cpp | 3 +++ 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/SocketIOclient.cpp b/src/SocketIOclient.cpp index 8fd8ad5..a06efa2 100644 --- a/src/SocketIOclient.cpp +++ b/src/SocketIOclient.cpp @@ -18,31 +18,37 @@ SocketIOclient::~SocketIOclient() { void SocketIOclient::begin(const char * host, uint16_t port, const char * url, const char * protocol) { WebSocketsClient::beginSocketIO(host, port, url, protocol); WebSocketsClient::enableHeartbeat(60 * 1000, 90 * 1000, 5); + initClient(); } void SocketIOclient::begin(String host, uint16_t port, String url, String protocol) { WebSocketsClient::beginSocketIO(host, port, url, protocol); WebSocketsClient::enableHeartbeat(60 * 1000, 90 * 1000, 5); + initClient(); } #if defined(HAS_SSL) void SocketIOclient::beginSSL(const char * host, uint16_t port, const char * url, const char * protocol) { WebSocketsClient::beginSocketIOSSL(host, port, url, protocol); WebSocketsClient::enableHeartbeat(60 * 1000, 90 * 1000, 5); + initClient(); } void SocketIOclient::beginSSL(String host, uint16_t port, String url, String protocol) { WebSocketsClient::beginSocketIOSSL(host, port, url, protocol); WebSocketsClient::enableHeartbeat(60 * 1000, 90 * 1000, 5); + initClient(); } -#if !defined(SSL_AXTLS) +#if defined(SSL_BARESSL) void SocketIOclient::beginSSLWithCA(const char * host, uint16_t port, const char * url, const char * CA_cert, const char * protocol) { WebSocketsClient::beginSocketIOSSLWithCA(host, port, url, CA_cert, protocol); WebSocketsClient::enableHeartbeat(60 * 1000, 90 * 1000, 5); + initClient(); } void SocketIOclient::beginSSLWithCA(const char * host, uint16_t port, const char * url, BearSSL::X509List * CA_cert, const char * protocol) { WebSocketsClient::beginSocketIOSSLWithCA(host, port, url, CA_cert, protocol); WebSocketsClient::enableHeartbeat(60 * 1000, 90 * 1000, 5); + initClient(); } void SocketIOclient::setSSLClientCertKey(const char * clientCert, const char * clientPrivateKey) { @@ -55,6 +61,18 @@ void SocketIOclient::setSSLClientCertKey(BearSSL::X509List * clientCert, BearSSL #endif #endif + +void SocketIOclient::configureEIOping(bool disableHeartbeat) { + _disableHeartbeat = disableHeartbeat; +} + +void SocketIOclient::initClient(void) { + if(_client.cUrl.indexOf("EIO=4") != -1) { + DEBUG_WEBSOCKETS("[wsIOc] found EIO=4 disable EIO ping on client\n"); + configureEIOping(true); + } +} + /** * set callback function * @param cbEvent SocketIOclientEvent @@ -148,8 +166,8 @@ bool SocketIOclient::sendEVENT(String & payload) { void SocketIOclient::loop(void) { WebSocketsClient::loop(); unsigned long t = millis(); - if((t - _lastConnectionFail) > EIO_HEARTBEAT_INTERVAL) { - _lastConnectionFail = t; + if(!_disableHeartbeat && (t - _lastHeartbeat) > EIO_HEARTBEAT_INTERVAL) { + _lastHeartbeat = t; DEBUG_WEBSOCKETS("[wsIOc] send ping\n"); WebSocketsClient::sendTXT(eIOtype_PING); } diff --git a/src/SocketIOclient.h b/src/SocketIOclient.h index cf674cb..6deb168 100644 --- a/src/SocketIOclient.h +++ b/src/SocketIOclient.h @@ -77,7 +77,10 @@ class SocketIOclient : protected WebSocketsClient { void loop(void); + void configureEIOping(bool disableHeartbeat = false); + protected: + bool _disableHeartbeat = false; uint64_t _lastHeartbeat = 0; SocketIOclientEvent _cbEvent; virtual void runIOCbEvent(socketIOmessageType_t type, uint8_t * payload, size_t length) { @@ -86,6 +89,8 @@ class SocketIOclient : protected WebSocketsClient { } } + void initClient(void); + // Handeling events from websocket layer virtual void runCbEvent(WStype_t type, uint8_t * payload, size_t length) { handleCbEvent(type, payload, length); diff --git a/src/WebSocketsClient.cpp b/src/WebSocketsClient.cpp index 8583ede..50ed631 100644 --- a/src/WebSocketsClient.cpp +++ b/src/WebSocketsClient.cpp @@ -945,6 +945,9 @@ void WebSocketsClient::handleHBPing() { if(sendPing()) { _client.lastPing = millis(); _client.pongReceived = false; + } else { + DEBUG_WEBSOCKETS("[WS-Client] sending HB ping failed\n"); + WebSockets::clientDisconnect(&_client, 1000); } } }