36

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's 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);
}

サーバーに障害が発生したため、接続を再試行するか放棄する必要があることをクライアントに伝える方法はありますか?

コードは大幅に簡略化されていますが、正確なコードではなく、プロトコルに関してのみ質問しています。

ありがとうございました

4

2 に答える 2

25

次のいずれかで実行する必要があります。

  1. 接続を閉じる (リセットまたはノーマルクローズ)
  2. クライアント エラーをトリガーする、不正な形式のチャンクを書き込む (そして接続を閉じる)
  3. 問題が発生したことをクライアントに伝えるhttp トレーラーを追加します。
  4. 上位レベルのプロトコルを変更してください。送信する最後のデータはハッシュまたは長さであり、クライアントはそれを処理することを知っています。
  5. 送信を開始する前にコンテンツのハッシュまたは長さ (http チャンクを使用する場合はカスタム ヘッダー) を生成できる場合は、それをヘッダーで送信して、クライアントが何を期待するかを知ることができます。

それは、クライアントにデータをどう処理してもらいたいかによって異なります (データを保持するか破棄するか)。クライアント側で変更を加えることができない場合があるため、たとえば最後のオプションは機能しません。

ここでは、さまざまな閉じ方について説明します。TCP オプション SO_LINGER (ゼロ) - 必要な場合

于 2013-03-09T00:22:57.410 に答える
-8

RFC 2616に従って、サーバーは 5xx で始まる応答コードを返す必要があると思います。

サーバー エラー 5xx

数字「5」で始まる応答ステータス コードは、サーバーがエラーを起こしたか、要求を実行できないことを認識している場合を示します。HEAD リクエストに応答する場合を除き、サーバーは、エラー状況の説明と、それが一時的な状態か永続的な状態かを含むエンティティを含める必要があります。ユーザー エージェントは、含まれているエンティティをユーザーに表示する必要があります。これらの応答コードは、すべての要求メソッドに適用されます。

于 2013-03-08T23:53:41.087 に答える