Несколько 100-продолжений получено с сервера
Я использую библиотеку libcurl (C++), чтобы сделать запрос к серверу IIS 7.5. Транзакция является обычной веб-службой SOAP.
Все работает нормально, мои запросы отправляют флаг "Ожидается 100-продолжение", и сервер отвечает 100-продолжением и сразу после этого кодом 200 ok вместе с ответом веб-службы.
Но время от времени клиент получает сообщение 100-continue и после этого еще один код 100. Это заставляет клиента сообщать об ошибке, поскольку он ожидает окончательный код состояния сразу после кода сервера 100. Я прочитал в протоколе W3C HTTP1.1:
Исходный сервер, который отправляет ответ 100 (Продолжить), ДОЛЖЕН, в конечном счете, отправить окончательный код состояния, как только тело запроса получено и обработано, если только оно не завершает транспортное соединение преждевременно.
Слово "в конечном счете" заставляет меня потерять след. Возможно ли / распространено ли, что сервер отправляет несколько 100 кодов после кода окончательного статуса?
Если кто-то сталкивался с этой проблемой ранее, можете ли вы указать мне любое объяснение о том, как обрабатывать несколько 100 кодов ответов с помощью libcurl?
заранее спасибо
2 ответа
Текущая спецификация говорит это на 100-продолжение:
Код состояния 100 (Продолжить) указывает, что начальная часть запроса была получена и еще не была отклонена сервером. Сервер намеревается отправить окончательный ответ после того, как запрос будет полностью получен и обработан.
Когда запрос содержит поле заголовка Expect, которое включает ожидание продолжения 100, ответ 100 указывает, что сервер желает получить тело полезной нагрузки запроса, как описано в разделе 5.1.1. Клиент должен продолжить отправку запроса и отменить ответ 100.
Если запрос не содержал поле заголовка Expect, содержащее ожидание 100-продолжений, клиент может просто отбросить этот промежуточный ответ.
То, как я это прочитал, не должно быть более одного 100-заголовочного ответа, и поэтому libcurl работает так. Я никогда не видел, чтобы это произошло (несколько сотен ответов), и некоторое время я занимался HTTP (я главный разработчик curl). Чтобы изменить это поведение, я ожидаю, что вам нужно будет немного исправить патч libcurl, чтобы это произошло.
Это не связано с CURLOPT_FAILONERROR.
Я подозреваю, что это потому, что есть необработанная ошибка, которая не обрабатывается клиентом должным образом. Убедитесь, что вы установили CURLOPT_FAILONERROR
флаг.
См. Этот пост для получения дополнительной информации.