Skip to content

Commit 8575e57

Browse files
committed
Catch websocket errors within the library and raise Library own ValloxApiException or ValloxWebsocketException
1 parent 746561c commit 8575e57

File tree

5 files changed

+49
-14
lines changed

5 files changed

+49
-14
lines changed

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ def parse_requirements(filename, parent=None):
3535
setup(
3636
name='vallox_websocket_api',
3737
packages=['vallox_websocket_api'],
38-
version='2.0.0',
38+
version='2.1.0',
3939
python_requires=">=3.5.1, <4",
4040
description='Vallox WebSocket API',
4141
author='Jevgeni Kiski',

tests/test_client.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,11 @@
22
import asynctest
33

44
from tests.decorators import with_client
5+
from asynctest import CoroutineMock
6+
7+
from websockets.exceptions import InvalidMessage
8+
9+
from vallox_websocket_api.exceptions import ValloxWebsocketException
510

611
class TestClient(asynctest.TestCase):
712
@with_client
@@ -87,4 +92,14 @@ async def testSetNewSettableAddressByAddress(self, client, ws):
8792

8893
await client.set_values({
8994
'A_CYC_RH_VALUE': 22
90-
})
95+
})
96+
97+
@with_client
98+
async def testSetNewSettableAddressByAddressException(self, client, ws):
99+
ws.recv.side_effect = CoroutineMock(side_effect=InvalidMessage())
100+
101+
client.set_settable_address(4363, int)
102+
103+
await self.assertAsyncRaisesRegex(ValloxWebsocketException, "Websocket handshake failed", client.set_values({
104+
'A_CYC_RH_VALUE': 22
105+
}))

vallox_websocket_api/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from .client import Client
22
from .vallox import Vallox, PROFILE
3+
from .exceptions import ValloxApiException, ValloxWebsocketException
34

4-
__all__ = ["Client", "Vallox", "PROFILE"]
5+
__all__ = ["Client", "Vallox", "PROFILE", "ValloxApiException", "ValloxWebsocketException"]

vallox_websocket_api/client.py

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
import numpy
2-
import re
31
import datetime
2+
import re
43

4+
import numpy
55
import websockets
66

77
from .constants import vlxDevConstants, vlxOffsetObject
8+
from .exceptions import ValloxWebsocketException
89

910
KPageSize = 65536
1011

@@ -220,15 +221,26 @@ def _decode_dict(self, dict):
220221
return new_dict
221222

222223
async def _websocket_request(self, command=vlxDevConstants.WS_WEB_UI_COMMAND_WRITE_DATA, dict=None, read_packets=1):
223-
async with websockets.connect("ws://%s/" % self.ip_address) as ws:
224-
request = self._make_payload(command, dict)
225-
await ws.send(request)
226-
results = []
227-
for i in range(0, read_packets):
228-
r = await ws.recv()
229-
230-
results.append(r)
231-
return results[0] if read_packets == 1 else results
224+
try:
225+
async with websockets.connect("ws://%s/" % self.ip_address) as ws:
226+
request = self._make_payload(command, dict)
227+
await ws.send(request)
228+
results = []
229+
for i in range(0, read_packets):
230+
r = await ws.recv()
231+
232+
results.append(r)
233+
return results[0] if read_packets == 1 else results
234+
except websockets.InvalidHandshake as e:
235+
raise ValloxWebsocketException('Websocket handshake failed') from e
236+
except websockets.InvalidURI as e:
237+
raise ValloxWebsocketException('Websocket invalid URI') from e
238+
except websockets.PayloadTooBig as e:
239+
raise ValloxWebsocketException('Websocket payload too big') from e
240+
except websockets.InvalidState as e:
241+
raise ValloxWebsocketException('Websocket invalid state') from e
242+
except websockets.WebSocketProtocolError as e:
243+
raise ValloxWebsocketException('Websocket protocol error') from e
232244

233245
async def fetch_metrics(self, metric_keys=None):
234246
metrics = {}

vallox_websocket_api/exceptions.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
class ValloxApiException(Exception):
2+
pass
3+
4+
class ValloxWebsocketException(ValloxApiException):
5+
"""
6+
Is raised on any websocket error
7+
"""

0 commit comments

Comments
 (0)