mirror of
https://github.com/esphome/esphome.git
synced 2026-02-08 00:31:58 +00:00
[dashboard] Close WebSocket after process exit to prevent zombie connections (#13834)
This commit is contained in:
@@ -317,6 +317,7 @@ class EsphomeCommandWebSocket(CheckOriginMixin, tornado.websocket.WebSocketHandl
|
|||||||
# Check if the proc was not forcibly closed
|
# Check if the proc was not forcibly closed
|
||||||
_LOGGER.info("Process exited with return code %s", returncode)
|
_LOGGER.info("Process exited with return code %s", returncode)
|
||||||
self.write_message({"event": "exit", "code": returncode})
|
self.write_message({"event": "exit", "code": returncode})
|
||||||
|
self.close()
|
||||||
|
|
||||||
def on_close(self) -> None:
|
def on_close(self) -> None:
|
||||||
# Check if proc exists (if 'start' has been run)
|
# Check if proc exists (if 'start' has been run)
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ from esphome.dashboard.entries import (
|
|||||||
bool_to_entry_state,
|
bool_to_entry_state,
|
||||||
)
|
)
|
||||||
from esphome.dashboard.models import build_importable_device_dict
|
from esphome.dashboard.models import build_importable_device_dict
|
||||||
from esphome.dashboard.web_server import DashboardSubscriber
|
from esphome.dashboard.web_server import DashboardSubscriber, EsphomeCommandWebSocket
|
||||||
from esphome.zeroconf import DiscoveredImport
|
from esphome.zeroconf import DiscoveredImport
|
||||||
|
|
||||||
from .common import get_fixture_path
|
from .common import get_fixture_path
|
||||||
@@ -1654,3 +1654,25 @@ async def test_websocket_check_origin_multiple_trusted_domains(
|
|||||||
assert data["event"] == "initial_state"
|
assert data["event"] == "initial_state"
|
||||||
finally:
|
finally:
|
||||||
ws.close()
|
ws.close()
|
||||||
|
|
||||||
|
|
||||||
|
def test_proc_on_exit_calls_close() -> None:
|
||||||
|
"""Test _proc_on_exit sends exit event and closes the WebSocket."""
|
||||||
|
handler = Mock(spec=EsphomeCommandWebSocket)
|
||||||
|
handler._is_closed = False
|
||||||
|
|
||||||
|
EsphomeCommandWebSocket._proc_on_exit(handler, 0)
|
||||||
|
|
||||||
|
handler.write_message.assert_called_once_with({"event": "exit", "code": 0})
|
||||||
|
handler.close.assert_called_once()
|
||||||
|
|
||||||
|
|
||||||
|
def test_proc_on_exit_skips_when_already_closed() -> None:
|
||||||
|
"""Test _proc_on_exit does nothing when WebSocket is already closed."""
|
||||||
|
handler = Mock(spec=EsphomeCommandWebSocket)
|
||||||
|
handler._is_closed = True
|
||||||
|
|
||||||
|
EsphomeCommandWebSocket._proc_on_exit(handler, 0)
|
||||||
|
|
||||||
|
handler.write_message.assert_not_called()
|
||||||
|
handler.close.assert_not_called()
|
||||||
|
|||||||
Reference in New Issue
Block a user