Допустимо ли сервер отправлять HTTP-ответ до получения всего запроса?
Рассмотрим большой HTTP-запрос:
POST /upload HTTP/1.1
Content-Type: multipart/form-data
Content-Length: 1048576
...
Теперь клиент начинает загружать мегабайт данных, что может занять некоторое время. Однако сервер определяет, что HTTP-авторизация необходима, поэтому он решает, что ответ будет отвечать HTTP 401 Unauthorized
.
ДОЛЖЕН сервер ждать, пока он не получит весь запрос (IE, заголовки + CRLF CRLF + Content-Length
байты), прежде чем он сможет ответить?
С практической точки зрения, будет ли такое поведение нарушать любые браузеры? В любом случае браузеры продолжают загружать файл, или они перестанут передавать, если они получат "преждевременный" ответ?
Что еще более важно, в этом случае они смогут успешно пройти аутентификацию и начать загрузку снова (с учетными данными), или это ненадежно отключить загрузку, как это?
Ответы
Ответ 1
Глядя на RFC 2616, который определяет протокол, в Разделе 8.2.2 "Мониторинг подключений для сообщений о статусе ошибки" он указывает
Клиент HTTP/1.1 (или более поздний), отправляющий тело сообщения, ДОЛЖЕН отслеживать сетевое подключение для состояния ошибки, пока он передает запрос. Если клиент видит состояние ошибки, он ДОЛЖЕН немедленно прекратить передачу тела.
Итак, я бы сказал, что вы можете перепрыгнуть по ошибке 401. А затем посмотрев 10.4.2 401 Несанкционированный
Запрос требует аутентификации пользователя. Ответ ДОЛЖЕН включать поле заголовка WWW-Authenticate (раздел 14.47), содержащее вызов, применимый к запрашиваемому ресурсу. Клиент МОЖЕТ повторить запрос с подходящим полем заголовка полномочий
Указывает, что клиент может повторить попытку с подходящими учетными данными.
Я не проводил никаких экспериментов, чтобы увидеть, как фактически выполняются браузеры.