
Глава 7. HTTP/1.1 255
компонентов, что вынуждает спецификацию протокола относиться более терпимо
к операциям с механизмом Expect. Может случиться так, что клиент, который посы-
лает заголовок Expect: 100-Continue, будет ждать ответа 417 Expectation Failed или
100 Continue неопределенное время. Чтобы исключить такую ситуацию, клиент дол-
жен уметь приостанавливать свою работу на определенное время, а после этого по-
сылать тело запроса (фактическая продолжительность таймаута может зависеть от
реализации клиента). Протокол запрещает клиенту ждать неопределегнюе время,
хотя и не определяет продолжительность таймаута. Поэтому клиент использует для
ожидания не детерминированный, а случайный период времени.
Механизм Expect является механизмом промежуточных передач. Ожидание оп-
ределенного результата распространяется только на ближайшего соседа, если сле-
дующий сервер не соответствует ожиданиям, то этот сервер должен вернуть код
ошибки 417 Expectation Failed. Однако заголовок запроса Expect является заго-
ловком сквозного тина. Если следующий сервер (например, прокси-сервер) пере-
сылает запрос дальше, поскольку сам он не может его обработать, он должен пере-
слать вместе с ним также и заголовок запроса Expect.
Хотя механизм Expect был предложен для обработки запросов большого объема,
связанных с методами PUT и POST, он может использоваться в будущем и для дру-
гих расширений. Серверы, которые пока еще не воспринимают новых расширений,
обязаны возвращать код состояния 417 Expectation Failed. Возможным расширени-
ем механизма Expect является совершенствование схемы согласований НТТР/1.1.
Интересно отметить, что заголовок Expect был введен не как управляемый кли-
ентом механизм согласования ожидаемого результата, а для решения проблемы,
связанной с ответом 100 Continue. Ответ 100 Continue был предложен почти за
два года до введения заголовка Expect. Ответ 100 Continue был введен, чтобы сер-
вер мог посылать промежуточный код ответа, если он был намерен продолжать
принимать входные данные от клиента. Клиент имеет разумное основание не посы-
лать содержимое своего запроса до тех пор, пока не убедится, что Web-сервер при-
мет его запрос. Если Web-сервер не намерен продолжать чтение входных данных,
он может послать сообщение об ошибке. Например, если запрос клиента POST,
включает заголовок Content-Length, и сервер знает, что не сможет обработать за-
прос такого размера, он может вернуть код ошибки. Если сервер может обработать
такой запрос, он может послать ответ 100 Continue. Такое решение требует, чтобы
клиент сделал паузу, прежде чем передавать содержимое запроса. Однако отправи-
тель может прождать очень долго, прежде чем выяснится, что сервер не собирается
посылать ни 100 Continue, пи сообщение об ошибке. Первым предложением было
ввести пятисекундный таймаут, но скоро стало ясно, что произвольно выбранное
время ожидания клиеггга не является удовлетворительным решением во всех слу-
чаях. Еще важнее было то, чтобы клиенты, использующие НТТР/1.0, не могли вос-
принимать ответ 100 Continue, так как он был определен только в НТТР/1.1.
Чтобы избежать такого рода проблем, был добавлен заголовок Expect, с таким рас-
четом, чтобы ответ 100 Continue был возможен только в том случае, если в запросе
присутствовал заголовок Expect. Не все клиенты должны ждать ответ 100 Continue.
Окончательная формулировка правил для клиентов и серверов в НТТР/1.1 содержит
следующее: клиент должен гюслать заголовок Expect, если он намерен ждать ответ
100 Continue, а сервер должен верпръ или 100 Continue, или заключительное сооб-
щение об ошибке. Если клиент, отправивший заголовок Expect, так и не получил от
Web-сервера ответ 100 Continue, он не должен ж^ать неопределенно долго, а может
продолжать свою работу и отправить содержимое запроса.