diff --git a/aiohttp/web_ws.py b/aiohttp/web_ws.py index 3d46ed544f6..90080b868a9 100644 --- a/aiohttp/web_ws.py +++ b/aiohttp/web_ws.py @@ -154,6 +154,13 @@ def send_bytes(self, data): type(data)) self._writer.send(data, binary=True) + def send_json(self, data, *, dumps=json.dumps): + if self._writer is None: + raise RuntimeError('Call .prepare() first') + if self._closed: + raise RuntimeError('websocket connection is closing') + self._writer.send(dumps(data), binary=False) + @asyncio.coroutine def wait_closed(self): # pragma: no cover warnings.warn( diff --git a/aiohttp/websocket_client.py b/aiohttp/websocket_client.py index e3e8c12a94a..04ccefee68b 100644 --- a/aiohttp/websocket_client.py +++ b/aiohttp/websocket_client.py @@ -3,6 +3,7 @@ import asyncio import sys +import json from enum import IntEnum from .websocket import Message @@ -88,6 +89,11 @@ def send_bytes(self, data): type(data)) self._writer.send(data, binary=True) + def send_json(self, data, *, dumps=json.dumps): + if self._closed: + raise RuntimeError('websocket connection is closed') + self._writer.send(dumps(data), binary=False) + @asyncio.coroutine def close(self, *, code=1000, message=b''): if not self._closed: @@ -171,6 +177,14 @@ def receive(self): finally: self._waiting = False + def receive_json(self, *, loads=json.loads): + msg = yield from self.receive() + if msg.tp != MsgType.text: + raise TypeError( + "Received message {}:{!r} is not str".format(msg.tp, msg.data) + ) + return msg.json(loads=loads) + if PY_35: @asyncio.coroutine def __aiter__(self):