From 309b2ad54f57f9a9ac9ab2b408eccf32843a5516 Mon Sep 17 00:00:00 2001 From: n9k Date: Thu, 16 Jun 2022 01:05:18 +0000 Subject: [PATCH] Control socket: minor redo exceptions --- anonstream/control/exceptions.py | 4 ++-- anonstream/control/parse.py | 7 ++----- anonstream/control/server.py | 6 +++--- anonstream/control/spec/__init__.py | 10 ++++++++-- anonstream/control/spec/methods/exit.py | 4 ++-- anonstream/control/spec/methods/title.py | 4 ++-- anonstream/control/spec/methods/user.py | 14 +++++++------- 7 files changed, 26 insertions(+), 23 deletions(-) diff --git a/anonstream/control/exceptions.py b/anonstream/control/exceptions.py index 8b2a5a0..f1fdba5 100644 --- a/anonstream/control/exceptions.py +++ b/anonstream/control/exceptions.py @@ -1,5 +1,5 @@ -class Exit(Exception): +class ControlSocketExit(Exception): pass -class Fail(Exception): +class CommandFailed(Exception): pass diff --git a/anonstream/control/parse.py b/anonstream/control/parse.py index 0f3c2fd..7924b62 100644 --- a/anonstream/control/parse.py +++ b/anonstream/control/parse.py @@ -1,4 +1,4 @@ -from anonstream.control.spec import NoParse, Ambiguous, Parsed +from anonstream.control.spec import ParseException, Parsed from anonstream.control.spec.common import Str from anonstream.control.spec.methods.chat import SPEC as SPEC_CHAT from anonstream.control.spec.methods.exit import SPEC as SPEC_EXIT @@ -25,10 +25,7 @@ async def parse(request): while True: try: spec, n_consumed, more_args = spec.consume(words, index) - except NoParse as e: - normal, response = None, e.args[0] + '\n' - break - except Ambiguous as e: + except ParseException as e: normal, response = None, e.args[0] + '\n' break except Parsed as e: diff --git a/anonstream/control/server.py b/anonstream/control/server.py index df8671b..caca535 100644 --- a/anonstream/control/server.py +++ b/anonstream/control/server.py @@ -1,6 +1,6 @@ import asyncio -from anonstream.control.exceptions import Exit, Fail +from anonstream.control.exceptions import ControlSocketExit, CommandFailed from anonstream.control.parse import parse def start_control_server_at(address): @@ -15,9 +15,9 @@ async def serve_control_client(reader, writer): else: try: normal, response = await parse(request) - except Fail as e: + except CommandFailed as e: normal, response = None, e.args[0] + '\n' - except Exit: + except ControlSocketExit: writer.close() break diff --git a/anonstream/control/spec/__init__.py b/anonstream/control/spec/__init__.py index 34e02a2..aa23898 100644 --- a/anonstream/control/spec/__init__.py +++ b/anonstream/control/spec/__init__.py @@ -1,7 +1,13 @@ -class NoParse(Exception): +class ParseException(Exception): pass -class Ambiguous(Exception): +class NoParse(ParseException): + pass + +class Ambiguous(ParseException): + pass + +class BadArgument(ParseException): pass class Parsed(Exception): diff --git a/anonstream/control/spec/methods/exit.py b/anonstream/control/spec/methods/exit.py index 2b57dda..a409d17 100644 --- a/anonstream/control/spec/methods/exit.py +++ b/anonstream/control/spec/methods/exit.py @@ -1,8 +1,8 @@ from anonstream.control.spec.common import Str, End -from anonstream.control.exceptions import Exit +from anonstream.control.exceptions import ControlSocketExit async def cmd_exit(): - raise Exit + raise ControlSocketExit async def cmd_exit_help(): normal = ['exit', 'help'] diff --git a/anonstream/control/spec/methods/title.py b/anonstream/control/spec/methods/title.py index 754ad87..f5d22bf 100644 --- a/anonstream/control/spec/methods/title.py +++ b/anonstream/control/spec/methods/title.py @@ -1,6 +1,6 @@ import json -from anonstream.control.exceptions import Fail +from anonstream.control.exceptions import CommandFailed from anonstream.control.spec import Spec, NoParse from anonstream.control.spec.common import Str, End, ArgsJsonString from anonstream.control.spec.utils import get_item, json_dumps_contiguous @@ -27,7 +27,7 @@ async def cmd_title_set(title): try: await set_stream_title(title) except OSError as e: - raise Fail(f'could not set title: {e}') from e + raise CommandFailed(f'could not set title: {e}') from e normal = ['title', 'set', json_dumps_contiguous(title)] response = '' return normal, response diff --git a/anonstream/control/spec/methods/user.py b/anonstream/control/spec/methods/user.py index 147f066..e7f70df 100644 --- a/anonstream/control/spec/methods/user.py +++ b/anonstream/control/spec/methods/user.py @@ -2,8 +2,8 @@ import json from quart import current_app -from anonstream.control.exceptions import Fail -from anonstream.control.spec import NoParse +from anonstream.control.exceptions import CommandFailed +from anonstream.control.spec import BadArgument from anonstream.control.spec.common import Str, End, ArgsInt, ArgsString, ArgsJson, ArgsJsonString from anonstream.control.spec.utils import get_item, json_dumps_contiguous from anonstream.utils.user import USER_WEBSOCKET_ATTRS @@ -17,7 +17,7 @@ class ArgsJsonTokenUser(ArgsJsonString): try: user = USERS_BY_TOKEN[token] except KeyError: - raise NoParse(f'no user with token {token!r}') + raise BadArgument(f'no user with token {token!r}') return user class ArgsJsonHashUser(ArgsString): @@ -26,7 +26,7 @@ class ArgsJsonHashUser(ArgsString): if user['token_hash'] == token_hash: break else: - raise NoParse(f'no user with token_hash {token_hash!r}') + raise BadArgument(f'no user with token_hash {token_hash!r}') return user def ArgsUser(spec): @@ -69,11 +69,11 @@ async def cmd_user_get(user, attr): try: value = user[attr] except KeyError as e: - raise Fail('user has no such attribute') from e + raise CommandFailed('user has no such attribute') from e try: value_json = json.dumps(value) except (TypeError, ValueError) as e: - raise Fail('value is not representable in json') from e + raise CommandFailed('value is not representable in json') from e normal = [ 'user', 'get', @@ -86,7 +86,7 @@ async def cmd_user_get(user, attr): async def cmd_user_set(user, attr, value): if attr not in user: - raise Fail(f'user has no attribute {attr!r}') + raise CommandFailed(f'user has no attribute {attr!r}') user[attr] = value if attr in USER_WEBSOCKET_ATTRS: USERS_UPDATE_BUFFER.add(user['token'])