From 28ededdd045549c3168ea4905c08ef7b2293af0a Mon Sep 17 00:00:00 2001 From: Tim Heiko <175552092+timheiko@users.noreply.github.com> Date: Fri, 8 Aug 2025 17:19:12 +0200 Subject: [PATCH] Chapter 21 - fix tcp_mojifinder.py crashes on empty search result MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes #61 Start the TCP server ```shell % ./tcp_mojifinder.py Building index. Serving on ('127.0.0.1', 2323). Hit CTRL-C to stop. ``` Connect to the TCP server and send a search query which return no results and some results, e.g. `missing` and `hat` ```shell % nc localhost 2323 ?> missing ────────────────────────────────────────────────────────────────── 0 found ?> hat U+2CD4 Ⳕ COPTIC CAPITAL LETTER OLD COPTIC HAT U+2CD5 ⳕ COPTIC SMALL LETTER OLD COPTIC HAT U+A271 ꉱ YI SYLLABLE HAT U+D571 핱 HANGUL SYLLABLE HAT U+1F3A9 🎩 TOP HAT U+1F452 👒 WOMANS HAT U+1F920 🤠 FACE WITH COWBOY HAT U+1F973 🥳 FACE WITH PARTY HORN AND PARTY HAT ────────────────────────────────────────────────────────────────── 8 found ?> ``` The TCP server log contains no errors and doesn't crash the TCP connection: ``` % ./tcp_mojifinder.py Building index. Serving on ('127.0.0.1', 2323). Hit CTRL-C to stop. From ('127.0.0.1', 63756): 'missing' To ('127.0.0.1', 63756): 0 results. From ('127.0.0.1', 63756): 'hat' To ('127.0.0.1', 63756): 8 results. ``` --- 21-async/mojifinder/tcp_mojifinder.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/21-async/mojifinder/tcp_mojifinder.py b/21-async/mojifinder/tcp_mojifinder.py index 4da7188..4bd4fc4 100755 --- a/21-async/mojifinder/tcp_mojifinder.py +++ b/21-async/mojifinder/tcp_mojifinder.py @@ -43,10 +43,11 @@ async def search(query: str, # <1> index: InvertedIndex, writer: asyncio.StreamWriter) -> int: chars = index.search(query) # <2> - lines = (line.encode() + CRLF for line # <3> - in format_results(chars)) - writer.writelines(lines) # <4> - await writer.drain() # <5> + if chars: + lines = (line.encode() + CRLF for line # <3> + in format_results(chars)) + writer.writelines(lines) # <4> + await writer.drain() # <5> status_line = f'{"─" * 66} {len(chars)} found' # <6> writer.write(status_line.encode() + CRLF) await writer.drain()