2022-06-13 07:23:17 +09:00
|
|
|
import asyncio
|
|
|
|
|
2022-06-14 17:29:32 +09:00
|
|
|
from anonstream.control.exceptions import Exit
|
|
|
|
from anonstream.control.parse import parse_request
|
2022-06-14 12:52:03 +09:00
|
|
|
|
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(request)
|
|
|
|
except Exit:
|
|
|
|
writer.close()
|
|
|
|
break
|
|
|
|
|
|
|
|
if normal is not None:
|
|
|
|
normal_method, normal_options = normal
|
|
|
|
if normal_method is not None:
|
|
|
|
writer.write(normal_method.encode())
|
|
|
|
for arg in normal_options:
|
|
|
|
writer.write(b' ')
|
|
|
|
writer.write(arg.encode())
|
|
|
|
writer.write(b'\n')
|
|
|
|
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()
|