Потоковая передача через forward proxy против буферизации всего ответа
Разделяйте потоковую передачу, буферизацию с опережающим чтением и обработку всего ответа, когда загрузка выглядит ожидающей на прокси.
Когда загрузка выглядит ожидающей, разделите три события: приход заголовков ответа, приход байтов тела и возможность приложения использовать или отобразить результат. Один индикатор загрузки не позволяет понять, какое из них задерживается.
Обычные этапы потоковой передачи могут перекрываться:
origin produces a chunk → proxy forwards bytes → client consumes themПрокси может записывать подходящее содержимое в кэш, передавая его дальше. Кэширование не требует ожидания всего файла. read_ahead_gap в Squid управляет выборкой, идущей впереди доставки, — это другой вид буферизации.
Обратное давление может временно останавливать чтение выше по потоку, когда медленный клиент заполняет очереди вывода. Content-Length также сообщает длину без полной буферизации. Кодирование HTTP/1.1 chunked допускает постепенную доставку, но не может обещать низкую задержку, если более ранний компонент удерживает данные.
Затем проверьте этапы обработки. Перезапись или инспекция могут требовать часть тела или всё тело. Сжатие и кадрирование приложения могут задерживать полезный вывод. На стороне клиента метод, ожидающий полный массив байтов, возвращается позже, а браузер может получить байты раньше, чем сможет их отобразить.
После успешного CONNECT обычный прокси передаёт поток сервиса, не нуждаясь в конечной длине туннелируемого файла. Прежде чем менять настройки буфера или тайм-аута, отследите первое отсутствующее событие выше. Когда наблюдателем является curl, его параметр no-buffer меняет локальный этап вывода.