62 lines
1.6 KiB
Python
Executable File
62 lines
1.6 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
|
|
import sys
|
|
import asyncio
|
|
|
|
from charfinder import UnicodeNameIndex
|
|
|
|
CRLF = b'\r\n'
|
|
PROMPT = b'?> '
|
|
|
|
index = None # a UnicodeNameIndex instance
|
|
|
|
|
|
@asyncio.coroutine
|
|
def handle_queries(reader, writer):
|
|
while True:
|
|
writer.write(PROMPT) # can't yield from!
|
|
yield from writer.drain() # must yield from!
|
|
data = yield from reader.readline()
|
|
try:
|
|
query = data.decode().strip()
|
|
except UnicodeDecodeError:
|
|
query = '\x00'
|
|
client = writer.get_extra_info('peername')
|
|
print('Received from {}: {!r}'.format(client, query))
|
|
if query:
|
|
if ord(query[:1]) < 32:
|
|
break
|
|
lines = list(index.find_description_strs(query))
|
|
if lines:
|
|
writer.writelines(line.encode() + CRLF for line in lines)
|
|
writer.write(index.status(query, len(lines)).encode() + CRLF)
|
|
|
|
yield from writer.drain()
|
|
print('Sent {} results'.format(len(lines)))
|
|
|
|
print('Close the client socket')
|
|
writer.close()
|
|
|
|
|
|
def main(address='127.0.0.1', port=8888):
|
|
port = int(port)
|
|
loop = asyncio.get_event_loop()
|
|
coro = asyncio.start_server(handle_queries, address, port, loop=loop)
|
|
server = loop.run_until_complete(coro)
|
|
|
|
host = server.sockets[0].getsockname()
|
|
print('Serving on {}. Hit CTRL-C to stop.'.format(host))
|
|
try:
|
|
loop.run_forever()
|
|
except KeyboardInterrupt: # CTRL+C pressed
|
|
pass
|
|
|
|
server.close()
|
|
loop.run_until_complete(server.wait_closed())
|
|
loop.close()
|
|
|
|
|
|
if __name__ == '__main__':
|
|
index = UnicodeNameIndex()
|
|
main(*sys.argv[1:])
|