From 916f174a80ed7c486ef83b106d77abe50336ccaa Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Mon, 14 May 2018 16:45:10 +0100 Subject: [PATCH 1/3] Fix non-graceful close --- CHANGELOG.md | 4 ++++ lomond/_version.py | 2 +- lomond/session.py | 4 +++- tests/test_session.py | 44 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 52 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8787161..5943129 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [Semantic Versioning](http://semver.org/). +## [0.2.3] - Unreleased + +### Fixed non-graceful close https://github.com/wildfoundry/dataplicity-lomond/issues/54 + ## [0.2.2] - 2018-05-09 ### Fixed diff --git a/lomond/_version.py b/lomond/_version.py index 2a6d151..34eb084 100644 --- a/lomond/_version.py +++ b/lomond/_version.py @@ -1,3 +1,3 @@ from __future__ import unicode_literals -__version__ = "0.2.2" +__version__ = "0.2.3" diff --git a/lomond/session.py b/lomond/session.py index 0694725..264015e 100644 --- a/lomond/session.py +++ b/lomond/session.py @@ -391,7 +391,9 @@ def _regular(): for event in _regular(): yield event else: - self._socket_fail('connection lost') + if websocket.is_active: + self._socket_fail('connection lost') + break except _ForceDisconnect as error: self._close_socket() yield events.Disconnected('disconnected; {}'.format(error)) diff --git a/tests/test_session.py b/tests/test_session.py index 062b322..c681d0a 100644 --- a/tests/test_session.py +++ b/tests/test_session.py @@ -337,6 +337,50 @@ def test_simple_run(monkeypatch, mocker): assert not _events[5].graceful +@mocketize +def test_simple_run_with_close(monkeypatch, mocker): + """Test graceful close.""" + monkeypatch.setattr( + 'os.urandom', b'\x00'.__mul__ + ) + Mocket.register( + MocketEntry( + ('example.com', 80), + [( + b'HTTP/1.1 101 Switching Protocols\r\n' + b'Upgrade: websocket\r\n' + b'Connection: Upgrade\r\n' + b'Sec-WebSocket-Accept: icx+yqv66kxgm0fcwalwlflwtai=\r\n' + b'\r\n' + b'\x81\x81\x00\x00\x00\x00A\x88\x80\xba51e' + )] + ) + ) + + session = WebsocketSession(WebSocket('ws://example.com/')) + session._selector_cls = FakeSelector + session._on_ready() + + session._regular_orig = session._regular + + mocker.patch( + 'lomond.websocket.WebSocket._send_close') + mocker.patch.object(session.websocket, 'send_ping') + session.websocket.state.session = session + + _events = list(session.run()) + + assert len(_events) == 7 + assert isinstance(_events[0], events.Connecting) + assert isinstance(_events[1], events.Connected) + assert isinstance(_events[2], events.Ready) + assert isinstance(_events[3], events.Poll) + assert isinstance(_events[4], events.Text) + assert isinstance(_events[5], events.Closing) + assert isinstance(_events[6], events.Disconnected) + assert _events[6].graceful + + @freeze_time("1994-05-01 18:40:00") @mocketize def test_unresponsive(monkeypatch, mocker): From 5523469ef442af687d1caf03db4c3e023e6d99b3 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Mon, 14 May 2018 16:52:45 +0100 Subject: [PATCH 2/3] doc tweak --- docs/guide.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide.rst b/docs/guide.rst index 2f369f3..972d165 100644 --- a/docs/guide.rst +++ b/docs/guide.rst @@ -215,7 +215,7 @@ You can send a ping / pong packet at any time with :meth:`~lomond.websocket.WebSocket.send_pong`. .. note:: - The server may send an pong packets *not* in response to a ping + The server may send pong packets *not* in response to a ping packet (see https://tools.ietf.org/html/rfc6455#section-5.5.3 for details). From 447089973387221e956b6376a2a5f0d0a45f406b Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Mon, 14 May 2018 21:25:32 +0100 Subject: [PATCH 3/3] version bump --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5943129..8183031 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [Semantic Versioning](http://semver.org/). -## [0.2.3] - Unreleased +## [0.2.3] - 2018-05-14 ### Fixed non-graceful close https://github.com/wildfoundry/dataplicity-lomond/issues/54