Ensure all sessions have a sessionId and are subscribed.

Simplify constructors, and factor out subscription code.

Change-Id: I4f3ed1eb06abec193d6db1f7c78815ffe1e1b5aa
This commit is contained in:
Jérémie Lesage
2018-06-21 15:32:53 +02:00
committed by Michael Meeks
parent 46b4c62139
commit f084ea53f6
2 changed files with 24 additions and 15 deletions

View File

@ -269,24 +269,23 @@ void AdminSocketHandler::handleMessage(bool /* fin */, WSOpCode /* code */,
}
}
/// Connection from remote admin socket
AdminSocketHandler::AdminSocketHandler(Admin* adminManager,
const std::weak_ptr<StreamSocket>& socket,
const Poco::Net::HTTPRequest& request)
: WebSocketHandler(socket, request),
_admin(adminManager),
_sessionId(0),
_isAuthenticated(false)
{
// Different session id pool for admin sessions (?)
_sessionId = Util::decodeId(LOOLWSD::GenSessionId());
}
/// Client connection to remote amdin socket
AdminSocketHandler::AdminSocketHandler(Admin* adminManager)
: WebSocketHandler(true),
_admin(adminManager),
_sessionId(0),
_isAuthenticated(true)
{
_sessionId = Util::decodeId(LOOLWSD::GenSessionId());
}
void AdminSocketHandler::sendTextFrame(const std::string& message)
@ -301,6 +300,17 @@ void AdminSocketHandler::sendTextFrame(const std::string& message)
LOG_TRC("Skip sending message to non-authenticated client: '" << message << "'");
}
void AdminSocketHandler::subscribeAsync(const std::shared_ptr<AdminSocketHandler> handler)
{
Admin &admin = Admin::instance();
admin.addCallback([handler]
{
Admin &adminIn = Admin::instance();
adminIn.getModel().subscribe(handler->_sessionId, handler);
});
}
bool AdminSocketHandler::handleInitialRequest(
const std::weak_ptr<StreamSocket> &socketWeak,
const Poco::Net::HTTPRequest& request)
@ -313,9 +323,6 @@ bool AdminSocketHandler::handleInitialRequest(
std::shared_ptr<StreamSocket> socket = socketWeak.lock();
// Different session id pool for admin sessions (?)
const size_t sessionId = Util::decodeId(LOOLWSD::GenSessionId());
const std::string& requestURI = request.getURI();
StringTokenizer pathTokens(requestURI, "/", StringTokenizer::TOK_IGNORE_EMPTY | StringTokenizer::TOK_TRIM);
@ -324,13 +331,9 @@ bool AdminSocketHandler::handleInitialRequest(
Admin &admin = Admin::instance();
auto handler = std::make_shared<AdminSocketHandler>(&admin, socketWeak, request);
socket->setHandler(handler);
admin.addCallback([handler, sessionId]
{
Admin &adminIn = Admin::instance();
AdminModel& model = adminIn.getModel();
handler->_sessionId = sessionId;
model.subscribe(sessionId, handler);
});
AdminSocketHandler::subscribeAsync(handler);
return true;
}
@ -676,7 +679,9 @@ public:
void Admin::connectToMonitorSync(const std::string &uri)
{
LOG_TRC("Add monitor " << uri);
insertNewWebSocketSync(Poco::URI(uri), std::make_shared<MonitorSocketHandler>(this, uri));
auto handler = std::make_shared<MonitorSocketHandler>(this, uri);
insertNewWebSocketSync(Poco::URI(uri), handler);
AdminSocketHandler::subscribeAsync(handler);
}
void Admin::scheduleMonitorConnect(const std::string &uri, std::chrono::steady_clock::time_point when)

View File

@ -23,8 +23,10 @@ class Admin;
class AdminSocketHandler : public WebSocketHandler
{
public:
/// Client connection to remote amdin socket
AdminSocketHandler(Admin* adminManager);
/// Connection from remote admin socket
AdminSocketHandler(Admin* adminManager,
const std::weak_ptr<StreamSocket>& socket,
const Poco::Net::HTTPRequest& request);
@ -34,6 +36,8 @@ public:
static bool handleInitialRequest(const std::weak_ptr<StreamSocket> &socket,
const Poco::Net::HTTPRequest& request);
static void subscribeAsync(const std::shared_ptr<AdminSocketHandler> handler);
private:
/// Sends text frames simply to authenticated clients.
void sendTextFrame(const std::string& message);