From 5d91e87c64f757fb1c20f43a0a30db3c73073625 Mon Sep 17 00:00:00 2001 From: Fabio Alessandrelli Date: Sun, 23 Sep 2018 21:14:20 +0200 Subject: Implement WebSocket close notify. --- modules/websocket/lws_server.cpp | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) (limited to 'modules/websocket/lws_server.cpp') diff --git a/modules/websocket/lws_server.cpp b/modules/websocket/lws_server.cpp index 4a614f6933..d13a8024fb 100644 --- a/modules/websocket/lws_server.cpp +++ b/modules/websocket/lws_server.cpp @@ -90,11 +90,24 @@ int LWSServer::_handle_cb(struct lws *wsi, enum lws_callback_reasons reason, voi peer_data->peer_id = id; peer_data->force_close = false; - _on_connect(id, lws_get_protocol(wsi)->name); break; } + case LWS_CALLBACK_WS_PEER_INITIATED_CLOSE: { + if (peer_data == NULL) + return 0; + + int32_t id = peer_data->peer_id; + if (_peer_map.has(id)) { + int code; + Ref peer = _peer_map[id]; + String reason = peer->get_close_reason(in, len, code); + _on_close_request(id, code, reason); + } + return 0; + } + case LWS_CALLBACK_CLOSED: { if (peer_data == NULL) return 0; @@ -118,10 +131,15 @@ int LWSServer::_handle_cb(struct lws *wsi, enum lws_callback_reasons reason, voi } case LWS_CALLBACK_SERVER_WRITEABLE: { - if (peer_data->force_close) + int id = peer_data->peer_id; + if (peer_data->force_close) { + if (_peer_map.has(id)) { + Ref peer = _peer_map[id]; + peer->send_close_status(wsi); + } return -1; + } - int id = peer_data->peer_id; if (_peer_map.has(id)) static_cast >(_peer_map[id])->write_wsi(); break; @@ -164,10 +182,10 @@ int LWSServer::get_peer_port(int p_peer_id) const { return _peer_map[p_peer_id]->get_connected_port(); } -void LWSServer::disconnect_peer(int p_peer_id) { +void LWSServer::disconnect_peer(int p_peer_id, int p_code, String p_reason) { ERR_FAIL_COND(!has_peer(p_peer_id)); - get_peer(p_peer_id)->close(); + get_peer(p_peer_id)->close(p_code, p_reason); } LWSServer::LWSServer() { -- cgit v1.2.3 From 4b92956db7cb479a1c3ee63f102f9866fbbc6fef Mon Sep 17 00:00:00 2001 From: Fabio Alessandrelli Date: Mon, 24 Sep 2018 00:58:28 +0200 Subject: Implement WebSocket clean close detection. --- modules/websocket/lws_server.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'modules/websocket/lws_server.cpp') diff --git a/modules/websocket/lws_server.cpp b/modules/websocket/lws_server.cpp index d13a8024fb..58fa043346 100644 --- a/modules/websocket/lws_server.cpp +++ b/modules/websocket/lws_server.cpp @@ -90,6 +90,7 @@ int LWSServer::_handle_cb(struct lws *wsi, enum lws_callback_reasons reason, voi peer_data->peer_id = id; peer_data->force_close = false; + peer_data->clean_close = false; _on_connect(id, lws_get_protocol(wsi)->name); break; } @@ -103,6 +104,7 @@ int LWSServer::_handle_cb(struct lws *wsi, enum lws_callback_reasons reason, voi int code; Ref peer = _peer_map[id]; String reason = peer->get_close_reason(in, len, code); + peer_data->clean_close = true; _on_close_request(id, code, reason); } return 0; @@ -112,11 +114,12 @@ int LWSServer::_handle_cb(struct lws *wsi, enum lws_callback_reasons reason, voi if (peer_data == NULL) return 0; int32_t id = peer_data->peer_id; + bool clean = peer_data->clean_close; if (_peer_map.has(id)) { _peer_map[id]->close(); _peer_map.erase(id); } - _on_disconnect(id); + _on_disconnect(id, clean); return 0; // we can end here } -- cgit v1.2.3