anonstream/anonstream/control/server.py

38 行
1.2 KiB
Python
Raw パーマリンク 通常表示 履歴

# SPDX-FileCopyrightText: 2022 n9k <https://gitler.moe/ninya9k>
2022-06-16 10:23:11 +09:00
# SPDX-License-Identifier: AGPL-3.0-or-later
2022-06-13 07:23:17 +09:00
import asyncio
2022-06-16 10:05:18 +09:00
from anonstream.control.exceptions import ControlSocketExit, CommandFailed
from anonstream.control.parse import parse
2022-06-13 07:23:17 +09:00
def start_control_server_at(address):
2022-06-13 12:46:02 +09:00
return asyncio.start_unix_server(serve_control_client, address)
2022-06-13 07:23:17 +09:00
2022-06-13 12:46:02 +09:00
async def serve_control_client(reader, writer):
2022-06-13 07:23:17 +09:00
while line := await reader.readline():
try:
request = line.decode('utf-8')
except UnicodeDecodeError as e:
2022-06-13 12:46:02 +09:00
normal, response = None, str(e)
2022-06-13 07:23:17 +09:00
else:
2022-06-13 12:46:02 +09:00
try:
normal, response = await parse(request)
2022-06-16 10:05:18 +09:00
except CommandFailed as e:
normal, response = None, e.args[0] + '\n'
2022-06-16 10:05:18 +09:00
except ControlSocketExit:
2022-06-13 12:46:02 +09:00
writer.close()
break
if normal is not None:
for index, word in enumerate(normal):
if index > 0:
2022-06-13 12:46:02 +09:00
writer.write(b' ')
writer.write(word.encode())
writer.write(b'\n')
2022-06-13 12:46:02 +09:00
elif response:
writer.write(b'error: ')
2022-06-13 07:23:17 +09:00
2022-06-13 12:46:02 +09:00
writer.write(response.encode())
await writer.drain()