| 13 | PROMPT = b'?> ' |
| 14 | |
| 15 | async def finder(index: InvertedIndex, # <2> |
| 16 | reader: asyncio.StreamReader, |
| 17 | writer: asyncio.StreamWriter) -> None: |
| 18 | client = writer.get_extra_info('peername') # <3> |
| 19 | while True: # <4> |
| 20 | writer.write(PROMPT) # can't await! # <5> |
| 21 | await writer.drain() # must await! # <6> |
| 22 | data = await reader.readline() # <7> |
| 23 | if not data: # <8> |
| 24 | break |
| 25 | try: |
| 26 | query = data.decode().strip() # <9> |
| 27 | except UnicodeDecodeError: # <10> |
| 28 | query = '\x00' |
| 29 | print(f' From {client}: {query!r}') # <11> |
| 30 | if query: |
| 31 | if ord(query[:1]) < 32: # <12> |
| 32 | break |
| 33 | results = await search(query, index, writer) # <13> |
| 34 | print(f' To {client}: {results} results.') # <14> |
| 35 | |
| 36 | writer.close() # <15> |
| 37 | await writer.wait_closed() # <16> |
| 38 | print(f'Close {client}.') # <17> |
| 39 | # end::TCP_MOJIFINDER_TOP[] |
| 40 | |
| 41 | # tag::TCP_MOJIFINDER_SEARCH[] |