После отправки статуса ответа по проводам его нельзя изменить. Таким образом, если вы отправили ответ 200 OK
, вы не сможете передумать впоследствии. Как вы обнаружили, это создает проблему в случае ошибок, возникающих в середине ответа.
Насколько я знаю, единственная мысль, которую вы можете сделать, - это отправить частичный ответ. См. Раздел 3.6.1 RFC 2616:
Кодированная часть изменяет тело сообщения, чтобы
передать его как последовательность кусков, каждый со своим собственным индикатором размера,
сопровождаемый ДОПОЛНИТЕЛЬНЫМ трейлером, содержащим поля заголовка объекта. это
позволяет динамически создаваемый контент передаваться вместе с
информация, необходимая получателю для подтверждения того, что он получил
полное сообщение.
Цель этого трейлера - предоставить информацию об теле сущности, которую невозможно рассчитать до отправки тела сущности. Тем не менее, раздел 7.1 позволяет включать в этот трейлер любой заголовок:
Механизм расширения заголовка допускает дополнительные поля заголовка объекта
быть определенным без изменения протокола, но эти поля не могут
быть признанным получателем узнаваемым. Нераспознанный заголовок
поля ДОЛЖНЫ игнорироваться получателем и ДОЛЖНЫ быть перенаправлены
прозрачные прокси.
Таким образом, хотя вы можете сигнализировать, что в середине ответа произошла ошибка, между двумя частями должно быть условно, как это сигнализируется. В общем, вы не можете использовать любой метод, который, как вы можете предположить, понимает клиент как сигнализирующий об ошибке.
Преждевременное завершение соединения в сообщении с заголовком Content-length
- это опция, но она явно запрещена:
Когда в сообщении указана длина содержимого, а тело сообщения
разрешено, значение его поля ДОЛЖНО точно соответствовать количеству OCTET в
тело сообщения. HTTP / 1.1 пользовательские агенты ДОЛЖНЫ уведомлять пользователя, когда
получена и обнаружена неверная длина.
Тем не менее, хотя сервер не должен отправлять сообщение короче, чем он рекламирует, клиент должен проверить это условие ошибки и сообщить об этом (а прокси-сервер может даже кэшировать этот частичный ответ).