Как я могу сообщить об ошибке на полпути через фрагментированный http-ответ, не закрывая соединение? - PullRequest
3 голосов
/ 02 октября 2008

У меня есть HTTP-сервер, который возвращает большие тела в ответ на запросы POST (это SOAP-сервер). Эти тела «текут» через чанкинг. Если во время потоковой передачи откроется ошибка, как я могу сообщить об этой ошибке клиенту и при этом сохранить соединение открытым? В реализации используется собственный стек HTTP / SOAP, поэтому меня интересуют ответы на уровне протокола HTTP.

Ответы [ 3 ]

2 голосов
/ 03 октября 2008

Также следует помнить, что фрагментированные ответы могут содержать "нижние колонтитулы" , которые аналогичны заголовкам HTTP. После сбоя можно отправить нижний колонтитул, например:

X-RealStatus: 500 Some bad stuff happened

Или, если вам это удастся:

X-RealStatus: 200 OK
2 голосов
/ 03 октября 2008

Как только сервер отправил клиенту строку состояния (самую первую строку ответа), вы больше не можете изменять код состояния ответа. Многие серверы откладывают отправку ответа из-за внутренней буферизации, пока буфер не заполнится. Пока буфер заполняется, вы можете изменить свое мнение об ответе.

Если у вашего клиента есть доступ к заголовкам ответа, вы можете использовать тот факт, что chunked-кодирование позволяет серверу добавлять трейлер с заголовками после тела, кодированного в chunked. Таким образом, ваш сервер, обнаружив ошибку, может изящно прекратить отправку тела, а затем отправить трейлер, который устанавливает некоторый заголовок для некоторого значения. Ваш клиент будет интерпретировать наличие этого заголовка как признак того, что произошла ошибка.

0 голосов
/ 03 октября 2008

вы можете изменить код состояния, если response.iscommitted () возвращает false. (Для HttpServletResponse в Java, я уверен, что существует эквивалент на других языках)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...