HTTPQUERY
Русский

100 Continue

Применение

Клиенты, включающие заголовок Expect, хотят убедиться, что сервер готов принять тело сообщения, прежде чем передавать его. Когда тело сообщения велико, использует тип содержимого, который сервер не принимает, или у пользователя нет прав на отправку файлов, этот процесс проверяет такие условия до отправки тела.

Как только приходит код состояния 100 Continue, тело сообщения отправляется. Если сервер возвращает 417, клиент не продолжает.

Преимущество использования заголовка Expect с 100-continue — экономия полосы пропускания, когда сервер избирателен в отношении получаемого и обрабатываемого содержимого.

Недостаток в том, что заголовок и тело HTTP-запроса отправляются независимо. В некоторых средах они склонны разделяться, из-за чего вместо обработки HTTP-запроса возвращается ошибка.

Пример

Запрос

PUT /docs HTTP/1.1
Host: example.com
Content-Type: application/pdf
Content-Length: 99000
Expect: 100-continue

Ответ

HTTP/1.1 100 Continue

Продолжение запроса

<PDF file contents are sent as message body>

Итоговый ответ

HTTP/1.1 200 OK

Клиент собирается отправить на сервер PDF-файл размером 99 КБ для обработки и указывает это в HTTP-запросе, запрашивая проверку заранее. Сервер отвечает положительно, и клиент отправляет тело сообщения. В качестве итогового ответа сервер завершает HTTP-сеанс признаком успеха.

В противном случае сервер отвечает ошибкой:

HTTP/1.1 417 Expectation Failed

В этой ситуации клиент не отправляет PDF, а дальнейшее взаимодействие начинается с нового HTTP-запроса.

Expect100Continue в клиентских библиотеках

Многие клиентские HTTP-библиотеки предоставляют Expect100Continue как настраиваемое свойство. В .NET свойство ServicePointManager.Expect100Continue определяет, включают ли запросы POST и PUT заголовок Expect: 100-continue автоматически. Отключение этого свойства пропускает предварительную проверку и сразу отправляет тело.

Примеры кода

.NET

HttpStatusCode.Continue

Rust

http::StatusCode::CONTINUE

Rails

:continue

Go

http.StatusContinue

Symfony

Response::HTTP_CONTINUE

Python3.5+

http.HTTPStatus.CONTINUE

Apache HttpComponents Core

org.apache.hc.core5.http.HttpStatus.SC_CONTINUE

Angular

@angular/common/http/HttpStatusCode.Continue