Похоже, что вы отправляете не ответ HTTP / 1, а ответ HTTP / 0.9 (обратите внимание, что я имею в виду ответ, отправленный с сервера, а не запрос, отправленный с клиента). Ответ HTTP / 1 состоит из заголовка HTTP и тела HTTP, аналогично тому, как создается запрос HTTP. Ответ HTTP / 0.9 вместо этого состоит только из фактического тела, то есть без заголовка и, следовательно, без мета-информации в заголовке, которая сообщает браузеру, что делать с телом.
HTTP / 0.9 устарел на 25 лет, но некоторые браузеры все еще поддерживают это. Когда браузер получает запрос HTTP / 0.9, он может что угодно, поскольку в заголовке HTTP нет определенного значения. Браузеры могут попытаться интерпретировать это как HTML, как обычный текст, предложить его для загрузки, полностью отказаться от него ... - что угодно.
Способ решения проблемы - отправить фактический заголовок ответа HTTP перед отправкой тела, т.е. что-то вроде этого
cs.send("HTTP/1.0 200 ok\r\nContent-type: application/octet-stream\r\n\r\n")
with open(path, 'rb') as re:
...
cs.send(read)
В любом случае: HTTP гораздо сложнее, чем вы думаете. Существуют установленные библиотеки для решения этой проблемы. Если вы настаиваете на том, чтобы не использовать какую-либо библиотеку, изучите стандарт, чтобы избежать подобных проблем.