async def search(query: str, index: InvertedIndex, writer: asyncio.StreamWriter) -> int: chars = index.search(query) lines = (line.encode() + CRLF for line in format_results(chars)) writer.writelines(lines) await writer.drain() writer.write(f"{'-'*66}".encode() + CRLF + f"{len(chars)} founded".encode() + CRLF) await writer.drain() return len(chars)
async def send_msg(stream: StreamWriter, data: bytes) -> None: """ encodes the size of payload into its header and then sends combined header and payload as a msg on wire. """ size_bytes = len(data).to_bytes(_NUM_BYTES_HEADER, byteorder=_BYTE_ORDER) stream.writelines([size_bytes, data]) await stream.drain()
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> status_line = f'{"─" * 66} {len(chars)} found' # <6> writer.write(status_line.encode() + CRLF) await writer.drain() return len(chars)
async def send_file(filepath: Path, writer: aio.StreamWriter, logger: logging.Logger): """ Used by server side to send file contents to a given client """ logger.debug(f'trying to send file {filepath}') with open(filepath, 'rb') as f: checksum = hashlib.md5() for line in f: checksum.update(line) checksum = checksum.digest() # logger.info(f'checksum of: {checksum}') await Message.write(writer, checksum) filesize = filepath.stat().st_size await Message.write(writer, filesize) f.seek(0) writer.writelines(f) # don't need to encode await writer.drain()
async def handle_client(reader: asyncio.StreamReader, writer: asyncio.StreamWriter): request = await reader.readuntil(b"\r\n\r\n") print(request.decode()) writer.writelines((b"HTTP/1.1 200 OK\r\n", b"\r\n")) await writer.drain() writer.write(b""" <html> <head> <title>An Example Page</title> </head> <body> <p>Hello World, this is a very simple HTML document.</p> </body> </html> """) await writer.drain() writer.write(b"\r\n") await writer.drain() writer.close()
async def send_msg(stream: StreamWriter, data: bytes): size_bytes = len(data).to_bytes(4, byteorder='big') stream.writelines([size_bytes, data]) await stream.drain()
async def send_msg(stream: StreamWriter, data: bytes): size_bytes = len(data).to_bytes(4, byteorder="big") # Write is the inverse of read: first we send the length of the data, encoded as 4 bytes, and thereafter the data. stream.writelines([size_bytes, data]) await stream.drain()
async def send_msg(stream: StreamWriter, data: bytes): # prepare the 'header' - the size of the data size_bytes = len(data).to_bytes(4, byteorder='big') stream.writelines([size_bytes, data]) # send the data size and the data itself await stream.drain()