HTTPQUERY
Русский

417 Expectation Failed

Применение

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

Когда запрос отправляется с заголовком Expect: 100-continue, сервер изучает соответствующие детали запроса. К ним относятся поля заголовков Content-Type или Content-Length. Если сервер готов принять тело сообщения, возвращается информационный ответ 100.

Если сервер не готов принять тело сообщения, отправляется подходящий статус, например 401 или 405. Ошибка 417 Expectation Failed возвращается только тогда, когда сервер или цепочка обработки ответа не поддерживает ожидания (expectations). При получении этого сообщения клиент повторно отправляет запрос без заголовка Expect.

Влияние на SEO

Поисковые системы, такие как Google, не будут индексировать URL со статусом ответа 417 Expectation Failed. Ранее проиндексированные URL будут удалены из результатов поиска.

Особые замечания для клиентов

Клиент, отправляющий Expect: 100-continue, не обязан ждать какое-то определённое время. Клиент приступает к передаче тела сообщения, не получив предварительно ответа. Поскольку серверы HTTP/1.0 не поддерживают ожидания, при использовании такого сервера в качестве промежуточного узла клиент не ждёт неограниченно долго перед передачей тела сообщения.

Особые замечания для серверов

Если сервер получает Expect: 100-continue в составе запроса HTTP/1.0, это ожидание должно быть проигнорировано. Серверу не нужно подтверждать его ответом 100, если тело сообщения уже получено или если тела сообщения нет.

Когда сервер отправляет 100, за ним в итоге должен следовать окончательный статус, например 200, если только соединение не было разорвано до этого.

Если сервер отвечает окончательным ответом до получения всего тела сообщения, ответ показывает, как сервер намерен поступить с соединением: закрыть его либо продолжить чтение и отбросить сообщение запроса.

Пример

Клиент запрашивает отправку PDF-файла размером 10K. Сервер отвечает 417 Expectation Failed, поскольку ожидания не поддерживаются.

Запрос

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

Ответ

HTTP/1.1 417 Expectation Failed
Content-Type: text/html
Content-Length: 159

<html>
  <head>
    <title>Expectations not supported</title>
  </head>
  <body>
   <p>Expectations are not supported by this server.
   </p>
  </body>
</html>

Как исправить

Удалите заголовок Expect: 100-continue и отправьте запрос заново, включив в него полное тело. Сервер или промежуточный прокси не поддерживает механизм 100-continue.

Многие HTTP-клиентские библиотеки добавляют заголовок Expect: 100-continue автоматически для больших полезных нагрузок без явного указания. Отключите это поведение на уровне библиотеки:

Проблемы с прокси и промежуточными узлами. Прокси HTTP/1.0, балансировщики нагрузки и устаревшие шлюзы не понимают рукопожатие Expect: 100-continue. Когда запрос проходит через такой промежуточный узел, прокси отклоняет запрос до того, как сервер-источник обработает ожидание. Обновление прокси или маршрутизация в обход промежуточных узлов HTTP/1.0 решает проблему в таких окружениях.

На стороне сервера этот статус редко встречается в современных HTTP-стеках. Большинство серверов либо соблюдают Expect: 100-continue, либо молча игнорируют заголовок. Возврат 417 — это осознанный сигнал удалить ожидание из запроса.

Примеры кода

.NET

HttpStatusCode.ExpectationFailed

Rust

http::StatusCode::EXPECTATION_FAILED

Rails

:expectation_failed

Go

http.StatusExpectationFailed

Symfony

Response::HTTP_EXPECTATION_FAILED

Python3.5+

http.HTTPStatus.EXPECTATION_FAILED

Java

HttpServletResponse.SC_EXPECTATION_FAILED

Apache HttpComponents Core

org.apache.hc.core5.http.HttpStatus.SC_EXPECTATION_FAILED

Angular

@angular/common/http/HttpStatusCode.ExpectationFailed