From 6cfc7e743431405350510e1e2879ccc3aab893e9 2015-11-25 17:02:51 From: Jan Kaluza Date: 2015-11-25 17:02:51 Subject: [PATCH] Do not start SlackRTM until we are really connected to WebSocket and the connection is upgraded --- diff --git a/include/transport/WebSocketClient.h b/include/transport/WebSocketClient.h index d936e0d0d00fc2d6e5641f9e0183e91933fffad8..c90638b203a2435b03d56db40ee666e3d440fcb8 100644 --- a/include/transport/WebSocketClient.h +++ b/include/transport/WebSocketClient.h @@ -60,6 +60,8 @@ class WebSocketClient { boost::signal onPayloadReceived; + boost::signal onWebSocketConnected; + private: void handleDNSResult(const std::vector&, boost::optional); void handleDataRead(boost::shared_ptr data); diff --git a/spectrum/src/frontends/slack/SlackRTM.cpp b/spectrum/src/frontends/slack/SlackRTM.cpp index 1a5e72f0fc9c917df3d5499b8080d6274ad75e8b..3d1eff7bc81e6502c6712b3d3bc8370c0815b0ac 100644 --- a/spectrum/src/frontends/slack/SlackRTM.cpp +++ b/spectrum/src/frontends/slack/SlackRTM.cpp @@ -43,6 +43,8 @@ SlackRTM::SlackRTM(Component *component, StorageBackend *storageBackend, UserInf m_counter = 0; m_client = new WebSocketClient(component); m_client->onPayloadReceived.connect(boost::bind(&SlackRTM::handlePayloadReceived, this, _1)); + m_client->onWebSocketConnected.connect(boost::bind(&SlackRTM::handleWebSocketConnected, this)); + m_pingTimer = m_component->getNetworkFactories()->getTimerFactory()->createTimer(20000); m_pingTimer->onTick.connect(boost::bind(&SlackRTM::sendPing, this)); @@ -127,7 +129,9 @@ void SlackRTM::handleRTMStart(HTTPRequest *req, bool ok, rapidjson::Document &re m_client->connectServer(u); m_pingTimer->start(); +} +void SlackRTM::handleWebSocketConnected() { onRTMStarted(); } diff --git a/spectrum/src/frontends/slack/SlackRTM.h b/spectrum/src/frontends/slack/SlackRTM.h index 66332d6d3f9a4df81f3c0610b457524100d7363d..8224749a9152bf92d254285b9247a4f9d206a07a 100644 --- a/spectrum/src/frontends/slack/SlackRTM.h +++ b/spectrum/src/frontends/slack/SlackRTM.h @@ -85,6 +85,7 @@ class SlackRTM { private: void handlePayloadReceived(const std::string &payload); void handleRTMStart(HTTPRequest *req, bool ok, rapidjson::Document &resp, const std::string &data); + void handleWebSocketConnected(); private: std::map m_channels; diff --git a/src/WebSocketClient.cpp b/src/WebSocketClient.cpp index 0a2a6fc2c2c093ffa47eec5e80fadd8ccfd62ae3..d67e31840f82f7b5d6a863c5455d5b8330f9c7c0 100644 --- a/src/WebSocketClient.cpp +++ b/src/WebSocketClient.cpp @@ -122,6 +122,7 @@ void WebSocketClient::handleDataRead(boost::shared_ptr dat if (m_buffer.find("\r\n\r\n") != std::string::npos) { m_buffer.erase(0, m_buffer.find("\r\n\r\n") + 4); m_upgraded = true; + onWebSocketConnected(); } else { return;