Коли завантажений файл починається з рядка стану 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-відповідь. Зашифровані байти після заголовків проксі — це не файл, який можна завантажити.
Невдалий або незавершений вивід залишайте під тимчасовою назвою. Публікуйте його лише після успішного перенесення та перевірок артефакту; непорожній файл не доводить повного завантаження.