Получено несколько 100-продолжений с сервера


Я использую библиотеку libcurl (c ++) для запроса к серверу IIS 7.5. Транзакция представляет собой обычный веб-сервис SOAP.

Все работает нормально, мои запросы отправляют флаг «Ожидайте 100-continue», а сервер отвечает 100-continue и сразу после этого код 200 ok. с ответом веб-службы.

Но время от времени клиент получает сообщение с продолжением 100, а после этого - еще один код 100. Это заставляет клиента сообщать об ошибке, поскольку он ожидает окончательный код состояния сразу после кода сервера 100. Я прочитал в протоколе W3C HTTP1.1:

Исходный сервер, который отправляет ответ 100 (Продолжить), ДОЛЖЕН в конечном итоге отправить окончательный код состояния после получения и обработки тела запроса, если только он не разорвет транспортное соединение преждевременно.

Слово «в конечном итоге» сбивает меня с пути. Возможно ли / распространено, что сервер отправляет несколько 100 кодов после кода окончательного статуса?

Если кто-нибудь сталкивался с этой проблемой раньше, можете ли я указать на какие-либо объяснения того, как обрабатывать несколько кодов ответа 100 с помощью libcurl?

заранее спасибо


person jcarrasco    schedule 02.04.2014    source источник


Ответы (2)


В текущей спецификации сказано это на 100-продолжении:

Код состояния 100 (Продолжить) указывает, что начальная часть запроса получена и еще не отклонена сервером. Сервер намеревается отправить окончательный ответ после того, как запрос будет полностью получен и обработан.

Когда запрос содержит поле заголовка Expect, которое включает ожидание продолжения 100, ответ 100 указывает, что сервер желает получить тело полезной нагрузки запроса, как описано в Разделе 5.1.1. Клиент должен продолжить отправку запроса и отклонить ответ 100.

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

Насколько я понимаю, это не должно быть более одного заголовка ответа с продолжением 100, и поэтому libcurl работает именно так. Я никогда не видел этого (несколько 100 ответов), и какое-то время я использую HTTP (я основной разработчик curl). Чтобы изменить это поведение, я ожидаю, что вам нужно немного исправить libcurl, чтобы это произошло.

Это не связано с CURLOPT_FAILONERROR.

person Daniel Stenberg    schedule 03.04.2014
comment
Хорошо, спасибо Дэниел. Я доложу владельцам серверов, чтобы узнать, что они могут сделать - person jcarrasco; 03.04.2014

Я подозреваю, что это связано с необработанной ошибкой, которая не обрабатывается клиентом должным образом. Убедитесь, что вы установили флаг CURLOPT_FAILONERROR.

Дополнительную информацию см. В этом сообщении SO.

person Community    schedule 02.04.2014