コード例 #1
0
ファイル: websocket.py プロジェクト: hayorov/turg
    async def get(self):
        ws = WebSocketResponse()
        await ws.prepare(self.request)

        self.request.app['websockets'].append(ws)
        db = self.request.app['db']

        async for msg in ws:
            logger.info("MSG: %s", msg)
            if msg.tp == WSMsgType.text:
                if msg.data == 'close':
                    await ws.close()
                else:
                    try:
                        data = json.loads(msg.data)
                    except:
                        pass
                    else:
                        logger.info("Got request: %s", data)
                        result = await process_request(data, db)
                        ws.send_json(result)

            elif msg.tp == WSMsgType.error:
                pass

        self.request.app['websockets'].remove(ws)

        return ws
コード例 #2
0
 def test_send_json_closed(self):
     req = self.make_request('GET', '/')
     ws = WebSocketResponse()
     self.loop.run_until_complete(ws.prepare(req))
     self.loop.run_until_complete(ws.close())
     with self.assertRaises(RuntimeError):
         ws.send_json({'type': 'json'})
コード例 #3
0
ファイル: test_web_websocket.py プロジェクト: mxxu/aiohttp
def test_send_json_closed(make_request):
    req = make_request('GET', '/')
    ws = WebSocketResponse()
    yield from ws.prepare(req)
    yield from ws.close()
    with pytest.raises(RuntimeError):
        ws.send_json({'type': 'json'})
コード例 #4
0
ファイル: test_web_websocket.py プロジェクト: kxepal/aiohttp
def test_send_json_closed(make_request):
    req = make_request("GET", "/")
    ws = WebSocketResponse()
    yield from ws.prepare(req)
    yield from ws.close()
    with pytest.raises(RuntimeError):
        ws.send_json({"type": "json"})
コード例 #5
0
def test_send_json_closed(make_request):
    req = make_request('GET', '/')
    ws = WebSocketResponse()
    yield from ws.prepare(req)
    yield from ws.close()
    with pytest.raises(RuntimeError):
        ws.send_json({'type': 'json'})
コード例 #6
0
ファイル: test_web_websocket.py プロジェクト: tumb1er/aiohttp
 def test_send_json_closed(self):
     req = self.make_request('GET', '/')
     ws = WebSocketResponse()
     self.loop.run_until_complete(ws.prepare(req))
     self.loop.run_until_complete(ws.close())
     with self.assertRaises(RuntimeError):
         ws.send_json({'type': 'json'})
コード例 #7
0
def function1203(function271, arg476):
    var1953 = function271('GET', '/')
    var1605 = WebSocketResponse()
    yield from var1605.prepare(var1953)
    var1605._reader.feed_data(WS_CLOSED_MESSAGE, 0)
    yield from var1605.close()
    arg476.spy(ws_logger, 'warning')
    var1605.send_json({'type': 'json', })
    assert ws_logger.warning.called
コード例 #8
0
def test_send_json_closed(make_request, mocker):
    req = make_request('GET', '/')
    ws = WebSocketResponse()
    yield from ws.prepare(req)
    yield from ws.close()

    mocker.spy(ws_logger, 'warning')
    ws.send_json({'type': 'json'})
    assert ws_logger.warning.called
コード例 #9
0
ファイル: test_web_websocket.py プロジェクト: Eyepea/aiohttp
def test_send_json_closed(make_request, mocker):
    req = make_request('GET', '/')
    ws = WebSocketResponse()
    yield from ws.prepare(req)
    ws._reader.feed_data(WS_CLOSED_MESSAGE, 0)
    yield from ws.close()

    mocker.spy(ws_logger, 'warning')
    ws.send_json({'type': 'json'})
    assert ws_logger.warning.called
コード例 #10
0
async def test_send_json_closed(make_request, mocker):
    req = make_request('GET', '/')
    ws = WebSocketResponse()
    await ws.prepare(req)
    ws._reader.feed_data(WS_CLOSED_MESSAGE, 0)
    await ws.close()

    mocker.spy(ws_logger, 'warning')
    ws.send_json({'type': 'json'})
    assert ws_logger.warning.called
コード例 #11
0
def function2225():
    var3068 = WebSocketResponse()
    with pytest.raises(RuntimeError):
        var3068.send_json({'type': 'json', })
コード例 #12
0
ファイル: test_web_websocket.py プロジェクト: tumb1er/aiohttp
 def test_nonstarted_send_json(self):
     ws = WebSocketResponse()
     with self.assertRaises(RuntimeError):
         ws.send_json({'type': 'json'})
コード例 #13
0
ファイル: test_web_websocket.py プロジェクト: mxxu/aiohttp
def test_nonstarted_send_json():
    ws = WebSocketResponse()
    with pytest.raises(RuntimeError):
        ws.send_json({'type': 'json'})
コード例 #14
0
ファイル: test_web_websocket.py プロジェクト: kxepal/aiohttp
def test_nonstarted_send_json():
    ws = WebSocketResponse()
    with pytest.raises(RuntimeError):
        ws.send_json({"type": "json"})
コード例 #15
0
ファイル: test_web_websocket.py プロジェクト: mxxu/aiohttp
def test_send_json_nonjson(make_request):
    req = make_request('GET', '/')
    ws = WebSocketResponse()
    yield from ws.prepare(req)
    with pytest.raises(TypeError):
        ws.send_json(set())
コード例 #16
0
ファイル: server.py プロジェクト: SkyPicker/Skywall
class WebsocketConnection:
    def __init__(self, server, request):
        self.client_id = self._get_request_client_id(request)
        self.connection_id = self._get_request_connection_id(self.client_id)
        self.server = server
        self.request = request
        self.socket = None

    def _get_request_client_id(self, request):
        try:
            client_id = request.headers[CLIENT_ID_HEADER]
            client_token = request.headers[CLIENT_TOKEN_HEADER]
        except KeyError:
            raise HTTPBadRequest(reason='Missing Client ID or Token Header')

        with create_session() as session:
            if client_id == 'None':
                client = Client(token=randomstring(32))
                before_client_create.emit(session=session, client=client)
                session.add(client)
                session.flush()
                after_client_create.emit(session=session, client=client)
            else:
                client = session.query(Client).filter(
                    Client.id == client_id).first()
                if not client or client.token != client_token:
                    raise HTTPForbidden(reason='Invalid Client ID or Token')
            return client.id

    def _get_request_connection_id(self, client_id):
        with create_session() as session:
            connection = Connection(client_id=client_id)
            before_connection_create.emit(session=session,
                                          connection=connection)
            session.add(connection)
            session.flush()
            after_connection_create.emit(session=session,
                                         connection=connection)
            return connection.id

    def _save_connection_last_activity(self):
        with create_session() as session:
            connection = session.query(Connection).filter(
                Connection.id == self.connection_id).first()
            connection.last_activity = current_timestamp()
            before_connection_update.emit(session=session,
                                          connection=connection)
            session.flush()
            after_connection_update.emit(session=session,
                                         connection=connection)

    def _save_connection_closed(self):
        with create_session() as session:
            connection = session.query(Connection).filter(
                Connection.id == self.connection_id).first()
            connection.closed = current_timestamp()
            before_connection_update.emit(session=session,
                                          connection=connection)
            session.flush()
            after_connection_update.emit(session=session,
                                         connection=connection)

    def _process_confirm(self, action):
        try:
            print(
                'Received confirmation of action "{}" with payload: {}'.format(
                    action.name, action.payload),
                flush=True)
            action.after_confirm.emit(connection=self, action=action)
            after_client_action_confirm.emit(connection=self, action=action)
        except Exception as e:
            print('Processing confirmation of action "{}" failed: {}'.format(
                action.name, e),
                  flush=True)

    def _process_action(self, action):
        try:
            print('Received action "{}" with payload: {}'.format(
                action.name, action.payload),
                  flush=True)
            before_server_action_receive.emit(connection=self, action=action)
            action.before_receive.emit(connection=self, action=action)
            action.execute(self)
            action.after_receive.emit(connection=self, action=action)
            after_server_action_receive.emit(connection=self, action=action)
            self.socket.send_json(action.send_confirm())
        except Exception as e:
            print('Executing action "{}" failed: {}'.format(action.name, e),
                  flush=True)

    def _process_message(self, msg):
        if msg.type != WSMsgType.TEXT:
            return
        try:
            action = parse_server_action(msg.data)
        except Exception as e:
            print('Invalid message received: {}; Error: {}'.format(
                msg.data, e),
                  flush=True)
            return
        if action.confirm:
            self._process_confirm(action)
        else:
            self._process_action(action)

    async def connect(self):
        before_server_connection_open.emit(connection=self)
        self.socket = WebSocketResponse()
        await self.socket.prepare(self.request)
        after_server_connection_open.emit(connection=self)
        self.send_client_id()
        async for msg in self.socket:
            self._save_connection_last_activity()
            self._process_message(msg)
        self._save_connection_closed()
        after_server_connection_ended.emit(connection=self)

    async def close(self):
        before_server_connection_close.emit(connection=self)
        await self.socket.close(code=WSCloseCode.GOING_AWAY)
        after_server_connection_close.emit(connection=self)

    def send_action(self, action):
        before_client_action_send.emit(connection=self, action=action)
        action.before_send.emit(connection=self, action=action)
        self.socket.send_json(action.send())
        action.after_send.emit(connection=self, action=action)
        after_client_action_send.emit(connection=self, action=action)

    async def check_send_action(self, action):
        future = asyncio.Future()
        sent_action = action

        def listener(connection, action):
            if connection is not self:
                return
            if action.name != sent_action.name:
                return
            if action.action_id != sent_action.action_id:
                return
            if not future.done():
                future.set_result(True)

        with after_client_action_confirm.connected(listener):
            self.send_action(sent_action)
            await asyncio.wait_for(future, ACTION_CONFIRM_TIMEOUT)

    def send_client_id(self):
        with create_session() as session:
            client = session.query(Client).filter(
                Client.id == self.client_id).first()
            self.send_action(
                SetIdClientAction(client_id=client.id,
                                  client_token=client.token))
コード例 #17
0
 def test_send_json_nonjson(self):
     req = self.make_request('GET', '/')
     ws = WebSocketResponse()
     self.loop.run_until_complete(ws.prepare(req))
     with self.assertRaises(TypeError):
         ws.send_json(set())
コード例 #18
0
 def test_nonstarted_send_json(self):
     ws = WebSocketResponse()
     with self.assertRaises(RuntimeError):
         ws.send_json({'type': 'json'})
コード例 #19
0
def test_send_json_nonjson(make_request):
    req = make_request('GET', '/')
    ws = WebSocketResponse()
    yield from ws.prepare(req)
    with pytest.raises(TypeError):
        ws.send_json(set())
コード例 #20
0
def function1324(function271):
    var3572 = function271('GET', '/')
    var2977 = WebSocketResponse()
    yield from var2977.prepare(var3572)
    with pytest.raises(TypeError):
        var2977.send_json(set())
コード例 #21
0
def test_nonstarted_send_json():
    ws = WebSocketResponse()
    with pytest.raises(RuntimeError):
        ws.send_json({'type': 'json'})
コード例 #22
0
ファイル: test_web_websocket.py プロジェクト: tumb1er/aiohttp
 def test_send_json_nonjson(self):
     req = self.make_request('GET', '/')
     ws = WebSocketResponse()
     self.loop.run_until_complete(ws.prepare(req))
     with self.assertRaises(TypeError):
         ws.send_json(set())