Когда загруженный файл начинается со строки состояния HTTP
Не допускайте попадания кадрирования HTTP-ответа в загруженный артефакт: не копируйте каждый байт, полученный из сокета прокси, в выходной файл.
Если предполагаемый PDF или электронная таблица начинается с HTTP/1.1 200 OK, загрузчик сохранил необработанный ответ вместо самого файла. В этом схематичном ответе всего четыре байта содержимого:
HTTP/1.1 200 OK
Transfer-Encoding: chunked
4
DATA
0
Артефакт — это DATA. Строка состояния, заголовки, маркер размера и завершающая структура относятся к HTTP. Удалять фиксированное число байт небезопасно, потому что длина заголовков меняется. Копирование всего после первой пустой строки всё равно оставляет кадрирование фрагментов, а информационные ответы могут предшествовать окончательному ответу.
Для обычной загрузки замените копирование из необработанного сокета в файл интерфейсом тела ответа HTTP-клиента. Настройте его прокси, проверьте итоговый статус и передайте тело потоком во временный файл. Клиент сам обрабатывает кадрирование сообщения: тела с указанием длины, chunked и ограниченные соединением требуют разного разбора.
Кодирование содержимого — ещё один уровень. Решите, нужны ли вам декодированные байты артефакта или явно запрошенное необработанное содержимое, опираясь на документированное поведение клиента. Сжатые байты — это не автоматическое повреждение прокси.
Если приложение должно сохранить код на уровне сокета, оно само отвечает за все эти правила разбора, а также за обработку чтения и записи. Записывайте только фактически возвращённое чтением число байт, а не ёмкость буфера, и обрабатывайте частичные записи. Иначе устаревшее содержимое буфера может испортить даже корректно извлечённое тело.
HTTPS требует большего, чем удаление ответа CONNECT: после успешного создания туннеля нужно установить TLS до назначения и затем разобрать внутренний HTTP-ответ. Зашифрованные байты после заголовков прокси — это не загружаемый файл.
Неудачный или неполный вывод оставляйте под временным именем. Публикуйте его только после успешной передачи и проверки артефакта; непустой файл не доказывает полную загрузку.