Skip to content

Commit c2c9af2

Browse files
committed
[websocket] Fix handling for connecting client's IP address
1 parent 8c2c519 commit c2c9af2

File tree

2 files changed

+37
-11
lines changed

2 files changed

+37
-11
lines changed

src/websockets/libwebsockets/LibWebsocketServer.cpp

Lines changed: 35 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ LibWebsocketServer::LibWebsocketServer()
4545
m_wsi(nullptr),
4646
m_retry_policy(),
4747
m_protocols(),
48+
m_connecting_ip_address(nullptr),
4849
m_clients()
4950
{
5051
}
@@ -278,18 +279,33 @@ int LibWebsocketServer::eventCallback(struct lws* wsi, enum lws_callback_reasons
278279
struct lws_filter_network_conn_args* filter = reinterpret_cast<struct lws_filter_network_conn_args*>(user);
279280

280281
// Get client IP address
281-
char ip_address[64];
282-
lws_sa46_write_numeric_address(reinterpret_cast<lws_sockaddr46*>(&filter->cli_addr), ip_address, sizeof(ip_address));
282+
// => Save the current IP address so it can be retrieved
283+
// in the LWS_CALLBACK_WSI_CREATE calls which happens
284+
// during the same event loop processing
285+
server->m_connecting_ip_address = new char[64u];
286+
lws_sa46_write_numeric_address(reinterpret_cast<lws_sockaddr46*>(&filter->cli_addr), server->m_connecting_ip_address, 64u);
283287

284288
// Notify user
285-
if (!server->m_listener->wsAcceptConnection(ip_address))
289+
if (!server->m_listener->wsAcceptConnection(server->m_connecting_ip_address))
286290
{
287291
// Disconnect
288292
ret = -1;
293+
294+
// Release memory
295+
delete[] server->m_connecting_ip_address;
289296
}
290297
}
291298
break;
292299

300+
case LWS_CALLBACK_WSI_CREATE:
301+
{
302+
// Set client IP address
303+
// => Must be done here to ensure that the event loop is still working
304+
// with the same client as in the LWS_CALLBACK_FILTER_NETWORK_CONNECTION call
305+
lws_set_wsi_user(wsi, server->m_connecting_ip_address);
306+
}
307+
break;
308+
293309
case LWS_CALLBACK_HTTP_CONFIRM_UPGRADE:
294310
{
295311
// Check selected protocol
@@ -418,8 +434,7 @@ int LibWebsocketServer::eventCallback(struct lws* wsi, enum lws_callback_reasons
418434
case LWS_CALLBACK_ESTABLISHED:
419435
{
420436
// Get client IP address
421-
char ip_address[64];
422-
lws_get_peer_simple(wsi, ip_address, sizeof(ip_address));
437+
char* ip_address = reinterpret_cast<char*>(lws_wsi_user(wsi));
423438

424439
// Instanciate a new client
425440
std::shared_ptr<IClient> client(new Client(wsi, ip_address));
@@ -455,21 +470,30 @@ int LibWebsocketServer::eventCallback(struct lws* wsi, enum lws_callback_reasons
455470
{
456471
client->m_listener->wsClientDisconnected();
457472
}
473+
}
474+
}
475+
break;
476+
477+
case LWS_CALLBACK_WSI_DESTROY:
478+
{
479+
// Get client IP address
480+
char* ip_address = reinterpret_cast<char*>(lws_wsi_user(wsi));
458481

482+
// Get corresponding client
483+
auto iter_client = server->m_clients.find(wsi);
484+
if (iter_client != server->m_clients.end())
485+
{
459486
// Remove client
460487
server->m_clients.erase(iter_client);
461488
}
462489
else
463490
{
464491
// Connection failed to be established
465-
466-
// Get client IP address
467-
char ip_address[64];
468-
lws_get_peer_simple(wsi, ip_address, sizeof(ip_address));
469-
470-
// Notify event
471492
server->m_listener->wsClientFailedToConnect(ip_address);
472493
}
494+
495+
// Release memory
496+
delete[] ip_address;
473497
}
474498
break;
475499

src/websockets/libwebsockets/LibWebsocketServer.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,8 @@ class LibWebsocketServer : public IWebsocketServer
180180
lws_retry_bo_t m_retry_policy;
181181
/** @brief Protocols */
182182
std::array<struct lws_protocols, 2u> m_protocols;
183+
/** @brief IP address of the currently connecting client */
184+
char* m_connecting_ip_address;
183185

184186
/** @brief Connected clients */
185187
std::unordered_map<struct lws*, std::shared_ptr<IClient>> m_clients;

0 commit comments

Comments
 (0)