import io def transfer(reader, writer, content_length = None, buffer_size = io.DEFAULT_BUFFER_SIZE): if content_length is None: while (data := reader.read(buffer_size)): writer.write(data) else: remaining = content_length while remaining > 0: size = min(buffer_size, remaining) writer.write(reader.read(size)) remaining -= size def sanitize_filename(s: str) -> str: return '.'.join([sanitize_filename_part(p) for p in s.split('.')]) def sanitize_filename_part(s: str) -> str: alnum_or_space = ''.join([c if c.isalnum() else ' ' for c in s]) return '-'.join(alnum_or_space.split())