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

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

3 ответа

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

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


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

X-RealStatus: 500 Some bad stuff happened

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

X-RealStatus: 200 OK


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

licensed under cc by-sa 3.0 with attribution.