5

私はアカデミック Java コースの一環として httpserver を構築しています。サーバーは基本的な GET および POST リクエストのみをサポートする必要があります。

HTML ファイル ストリーム コンテンツを HttpServer 出力ストリームに書き込む途中(および既に応答ヘッダーを送信した後) に発生するエラーを処理するエレガントな方法があるかどうか疑問に思っていました。

洗練された方法で、ユーザーを「内部サーバー エラー」エラー ページに表示またはリダイレクトすることについて言及します。

HTTP 応答ヘッダーを 501 エラー コードで再送信しようとしましたが、Java は、ヘッダーが既に送信されていると主張する例外をスローします...

1 つの修正方法は、ファイルの内容をメモリに読み込んでからヘッダーと内容を送信することですが、他の問題が発生する可能性があります。さらに、応答として送信する前に巨大なファイルをメモリにロードしたくありません。 .

4

2 に答える 2

5

応答ステータスがネットワーク上で送信されると、それを変更することはできません。そのため、返信を送信した場合、200 OK後で気が変わることはありません。お気づきのように、これは応答中にエラーが発生した場合に問題を引き起こします。

私の知る限り、できることは、チャンクされた応答を送信することだけです。RFC 2616 のセクション 3.6.1 を参照してください。

チャンク エンコーディングは、メッセージの本文を変更して、一連のチャンクとして転送します。それぞれに独自のサイズ インジケーターがあり、その後にエンティティ ヘッダー フィールドを含む OPTIONAL トレーラーが続きます。これにより、動的に生成されたコンテンツを、受信者が完全なメッセージを受信したことを確認するために必要な情報とともに転送できます。

このトレーラーの目的は、エンティティ本体が送信される前に計算できないエンティティ本体に関する情報を提供することです。ただし、セクション 7.1 では、このトレーラーに任意のヘッダーを含めることができます。

拡張ヘッダー メカニズムにより、プロトコルを変更せずに追加のエンティティ ヘッダー フィールドを定義できますが、これらのフィールドを受信者が認識できると想定することはできません。認識されていないヘッダー フィールドは、受信者によって無視されるべきであり、透過的なプロキシによって転送されなければなりません (SHOULD)。

そのため、応答の途中でエラーが発生したことを知らせることはできますが、これがどのように通知されるかは、2 つの部分の間で取り決めを行う必要があります。一般に、クライアントがエラー状態を通知していると理解できると想定できる方法を使用することはできません。

ヘッダー付きのメッセージで途中で接続を終了するContent-lengthことはオプションですが、明示的に禁止されています。

メッセージ本文が許可されているメッセージで Content-Length が指定されている場合、そのフィールド値はメッセージ本文の OCTET の数と正確に一致する必要があります。HTTP/1.1 ユーザー エージェントは、無効な長さを受信して​​検出した場合、ユーザーに通知する必要があります。

とは言っても、サーバーは宣伝するよりも短いメッセージを送信してはなりませんが、クライアントはこのエラー状態をチェックし、そのように報告する必要があります (プロキシはこの部分的な応答をキャッシュすることさえあります)。

于 2011-08-17T10:35:37.440 に答える
-1

エレガントな方法で、ユーザーを「内部サーバーエラー」エラーページに表示またはリダイレクトすることを指します。

'success'応答を送信できない場合、別の応答をどのように送信しますか?あなたができることはそれを記録してそれを忘れることだけです。

于 2011-08-17T10:43:54.110 に答える