Как мне сообщить об ошибке в середине HTTP-ответа, не закрывая соединение?

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

Марк, я обновил свой исходный пост. Но я не знаю, заметите ли вы это, поскольку вы уже отметили ответ как принятый. Этот комментарий здесь, чтобы привлечь ваше внимание, появившись на вкладке "Ответы" в вашей учетной записи ...

Alexander 03.10.2008 01:39
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
1
342
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

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

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

Я надеялся, что существует какая-то конвенция для переговоров о предоставлении «альтернативного» статуса. Например. вставляя его в окончательные расширения куска нулевого размера (после 0; до \ r \ n \ r \ n).

Mark Zeren 03.10.2008 01:34

Да, эта идея тоже пришла мне в голову (но только после моего первоначального поста). Смотрите второй абзац, который я добавил.

Alexander 03.10.2008 01:37

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

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

X-RealStatus: 500 Some bad stuff happened

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

X-RealStatus: 200 OK

Другие вопросы по теме