def _parse_message(self, payload: bytes, is_binary: bool) -> object: """Parse a client message into a JSON object. :raise WebSocketError: if the message doesn't contain UTF-8 encoded text or cannot be parsed as JSON """ if is_binary: raise WebSocketError('malformed_message', 'message is binary') try: text = payload.decode() logger.debug('Received text message from client %s: %s', self._client, text) return loads(text) except ValueError as err: raise WebSocketError('malformed_message', err.args[0])
def _raise_if_unknown_field_value(self, field_name: str, err: colander.Invalid, json_object: dict): """Raise an 'unknown_xxx' WebSocketError error if appropriate.""" errdict = err.asdict() if (self._is_only_key(errdict, field_name) and field_name in json_object): field_value = json_object[field_name] raise WebSocketError('unknown_' + field_name, field_value)
def _dispatch_event_notification_to_subscribers(self, notification: dict): event = notification['event'] resource = notification['resource'] if event == 'created': self._dispatch_created_event(resource) elif event == 'modified': self._dispatch_modified_event(resource) elif event == 'removed': self._dispatch_removed_event(resource) elif event == 'changed_descendants': self._dispatch_changed_descendants_event(resource) else: details = 'unknown event: {}'.format(event) raise WebSocketError('invalid_json', details)
def _raise_invalid_json_from_exception(self, err: Exception): raise WebSocketError('invalid_json', str(err)) # pragma: no cover
def _raise_invalid_json_from_colander_invalid(self, err: colander.Invalid): errdict = err.asdict() errlist = ['{}: {}'.format(k, errdict[k]) for k in errdict.keys()] details = ' / '.join(sorted(errlist)) raise WebSocketError('invalid_json', details)
def test_str(self): from adhocracy_core.websockets import WebSocketError err = WebSocketError('malformed_message', 'message is binary') assert str(err) == 'malformed_message: message is binary'