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





После того, как сервер отправил клиенту строку состояния (самую первую строку ответа), вы больше не сможете изменить код состояния ответа. Многие серверы задерживают отправку ответа, буферизуя его внутренне, пока буфер не заполнится. Пока буфер заполняется, вы все равно можете изменить свое мнение об ответе.
Если у вашего клиента есть доступ к заголовкам ответа, вы можете использовать тот факт, что фрагментированное кодирование позволяет серверу добавлять трейлер с заголовками после фрагментированного тела. Итак, ваш сервер, столкнувшись с ошибкой, может корректно прекратить отправку тела, а затем отправить трейлер, который устанавливает некоторый заголовок в какое-то значение. Тогда ваш клиент интерпретирует присутствие этого заголовка как признак того, что произошла ошибка.
Я надеялся, что существует какая-то конвенция для переговоров о предоставлении «альтернативного» статуса. Например. вставляя его в окончательные расширения куска нулевого размера (после 0; до \ r \ n \ r \ n).
Да, эта идея тоже пришла мне в голову (но только после моего первоначального поста). Смотрите второй абзац, который я добавил.
вы можете изменить код состояния, если response.iscommitted () возвращает false. (fot HttpServletResponse в java, я уверен, что существует эквивалент на других языках)
Также имейте в виду, что фрагментированные ответы могут содержать "нижние колонтитулы", которые похожи на заголовки HTTP. В случае неудачи вы можете отправить нижний колонтитул, например:
X-RealStatus: 500 Some bad stuff happened
Или, если вам это удастся:
X-RealStatus: 200 OK
Марк, я обновил свой исходный пост. Но я не знаю, заметите ли вы это, поскольку вы уже отметили ответ как принятый. Этот комментарий здесь, чтобы привлечь ваше внимание, появившись на вкладке "Ответы" в вашей учетной записи ...