Refactor sendMessageToConnection method to enhance user data validation and message handling
- Introduce a local copy of the message to ensure its validity during processing. - Validate user data retrieved from the WebSocket interface to ensure consistency before queuing messages. - Streamline logging by removing redundant checks and focusing on critical error handling, improving overall clarity and stability.
This commit is contained in:
committed by
Torsten (PC)
parent
7a2749c405
commit
52c7f1c7ba
@@ -870,53 +870,37 @@ void WebSocketServer::sendMessageToConnection(struct lws *wsi, WebSocketUserData
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::cout << "[sendMessageToConnection] Start, wsi=" << wsi << ", ud=" << ud << ", message.length()=" << message.length() << std::endl;
|
|
||||||
|
|
||||||
try {
|
|
||||||
// Prüfe ob ud noch gültig ist, bevor wir den Mutex locken
|
|
||||||
std::cout << "[sendMessageToConnection] Prüfe ud-Gültigkeit..." << std::endl;
|
|
||||||
volatile bool test = ud->pongReceived;
|
|
||||||
(void)test;
|
|
||||||
std::cout << "[sendMessageToConnection] ud ist gültig" << std::endl;
|
|
||||||
|
|
||||||
// Kopiere die Nachricht, um sicherzustellen, dass sie gültig bleibt
|
// Kopiere die Nachricht, um sicherzustellen, dass sie gültig bleibt
|
||||||
std::string messageCopy = message;
|
std::string messageCopy = message;
|
||||||
std::cout << "[sendMessageToConnection] Nachricht kopiert: " << messageCopy.length() << " Bytes" << std::endl;
|
|
||||||
|
|
||||||
bool wasEmpty = false;
|
// Hole ud erneut aus wsi, um sicherzustellen, dass es gültig ist
|
||||||
{
|
// Das ist wichtig, wenn wir während eines Callbacks aufgerufen werden
|
||||||
std::cout << "[sendMessageToConnection] Versuche Mutex zu locken..." << std::endl;
|
auto* udFromWsi = reinterpret_cast<WebSocketUserData*>(lws_wsi_user(wsi));
|
||||||
std::lock_guard<std::mutex> lock(ud->messageQueueMutex);
|
if (!udFromWsi || udFromWsi != ud) {
|
||||||
std::cout << "[sendMessageToConnection] Mutex gelockt" << std::endl;
|
std::cerr << "[sendMessageToConnection] ud stimmt nicht mit wsi überein oder ist ungültig" << std::endl;
|
||||||
|
|
||||||
// Prüfe ob ud noch gültig ist, nachdem wir den Mutex gelockt haben
|
|
||||||
if (!ud) {
|
|
||||||
std::cerr << "[sendMessageToConnection] ud wurde während des Lockens ungültig" << std::endl;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::cout << "[sendMessageToConnection] Prüfe Queue-Größe..." << std::endl;
|
// Verwende udFromWsi statt ud, um sicherzustellen, dass wir auf die richtige Instanz zugreifen
|
||||||
wasEmpty = ud->messageQueue.empty();
|
ud = udFromWsi;
|
||||||
std::cout << "[sendMessageToConnection] Queue war leer: " << wasEmpty << std::endl;
|
|
||||||
|
|
||||||
std::cout << "[sendMessageToConnection] Füge Nachricht zur Queue hinzu..." << std::endl;
|
try {
|
||||||
|
bool wasEmpty = false;
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(ud->messageQueueMutex);
|
||||||
|
wasEmpty = ud->messageQueue.empty();
|
||||||
ud->messageQueue.push(messageCopy);
|
ud->messageQueue.push(messageCopy);
|
||||||
std::cout << "[sendMessageToConnection] Nachricht zur Queue hinzugefügt, neue Größe: " << ud->messageQueue.size() << std::endl;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Nur wenn die Queue leer war, den Callback aufrufen
|
// Nur wenn die Queue leer war, den Callback aufrufen
|
||||||
// (sonst wird er bereits durch den WRITEABLE-Handler aufgerufen)
|
// (sonst wird er bereits durch den WRITEABLE-Handler aufgerufen)
|
||||||
if (wasEmpty) {
|
if (wasEmpty) {
|
||||||
std::cout << "[sendMessageToConnection] Queue war leer, rufe lws_cancel_service auf..." << std::endl;
|
|
||||||
// Verwende lws_cancel_service, um den Service zu benachrichtigen
|
// Verwende lws_cancel_service, um den Service zu benachrichtigen
|
||||||
// Das ist sicherer, wenn wir uns in einem Callback befinden
|
// Das ist sicherer, wenn wir uns in einem Callback befinden
|
||||||
// lws_cancel_service triggert einen Service-Loop, der dann LWS_CALLBACK_SERVER_WRITEABLE aufruft
|
|
||||||
if (context) {
|
if (context) {
|
||||||
lws_cancel_service(context);
|
lws_cancel_service(context);
|
||||||
std::cout << "[sendMessageToConnection] lws_cancel_service aufgerufen" << std::endl;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
std::cout << "[sendMessageToConnection] Erfolgreich abgeschlossen" << std::endl;
|
|
||||||
} catch (const std::exception &e) {
|
} catch (const std::exception &e) {
|
||||||
std::cerr << "[sendMessageToConnection] Fehler: " << e.what() << std::endl;
|
std::cerr << "[sendMessageToConnection] Fehler: " << e.what() << std::endl;
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
|
|||||||
Reference in New Issue
Block a user