Что делать с ошибками при потоковой передаче тела запроса Http - программирование
Подтвердить что ты не робот

Что делать с ошибками при потоковой передаче тела запроса Http

Как обрабатывать ошибку сервера в середине сообщения Http?

Предполагая, что я уже отправил заголовок сообщения, и я передаю тело сообщения, что мне делать, когда я сталкиваюсь с непредвиденной ошибкой.

Я также предполагаю, что эта ошибка была вызвана при создании контента, а не ошибке соединения.

(Отлично) Упрощенный код:

// I can define any transfer encoding or header fields i need to.
send(header);  // Sends the header to the Http client.

// Using an iterable instead of stream for code simplicity sake.
Iterable<String> stream = getBodyStream();
Iterator<String> iterator = stream.iterator();

while (iterator.hasNext()) {
    String string;
    try {
       string = iterator.next();   
    catch (Throwable error) { // Oops! an error generating the content.
        // What do i do here? (In regards to the Http protocol)
    }

    send(string);
}

Есть ли способ сообщить клиенту, что сервер потерпел неудачу, и должен либо повторить попытку, либо отказаться от соединения, либо я соул?

Код очень упрощен, но я только прошу в отношении протокола, а не точного кода.

Спасибо

4b9b3361

Ответ 1

Это одно из следующих действий:

  • Закройте соединение (reset или нормальное закрытие)
  • Напишите неверный фрагмент (и закройте соединение), который приведет к ошибке клиента
  • Добавьте http trailer, сообщающий вашему клиенту, что что-то пошло не так.
  • Измените протокол более высокого уровня. Последняя часть данных, которую вы отправляете, является хешем или длиной, и клиент знает, как с этим справиться.
  • Если вы можете сгенерировать хэш или длину (в пользовательском заголовке, если используете фрагменты http) вашего контента, прежде чем начать отправку, вы можете отправить его в заголовке, чтобы ваш клиент знал, чего ожидать.

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

Вот несколько объяснений по поводу различных способов закрытия. Параметр TCP SO_LINGER (ноль) - если требуется. Посмотрите на ответ с наивысшим счетом, а не с принятым.

Ответ 2

Я думаю, сервер должен вернуть код ответа с 5xx по RFC 2616.

Ошибка сервера 5xx

Коды состояния ответа, начинающиеся с цифры "5", указывают случаи, когда сервер знает, что он ошибся или не может выполнить запрос. За исключением случаев ответа на запрос HEAD, сервер ДОЛЖЕН включать объект, содержащий объяснение ситуации ошибки, и является ли это временным или постоянным условием. Пользовательские агенты ДОЛЖНЫ отображать любой объект, включенный в список. Эти коды ответов применимы к любому методу запроса.