これは、組み込みの Javaと多段階認証スキームを使用して発生したいくつかの問題のフォローアップ投稿です。com.sun.net.httpserver.HttpServer
大量のデータを送信すると、Java クライアントが初期の「Authorization required」メッセージを受信できなくなることが示唆されました(Java が I/O をブロックしているため)。
これが、HTTP が 100 ステータス コード ( RFC 2616 )を含む「expect-continue ハンドシェイク」を定義する理由です。
100 (Continue) ステータスの目的は、クライアントがリクエスト本文を送信する前に、オリジン サーバーが (リクエスト ヘッダーに基づいて) リクエストを受け入れる意思があるかどうかを、リクエスト本文を含むリクエスト メッセージを送信しているクライアントが判断できるようにすることです。 . 場合によっては、サーバーが本文を確認せずにメッセージを拒否する場合、クライアントが本文を送信することは不適切または非常に非効率的である可能性があります。
したがって、この場合、データを送信することは適切ではありません。サーバー...
100 (Continue) ステータスで応答して入力ストリームからの読み取りを続行するか、最終ステータス コードで応答する必要があります。
残念ながら、Sunはアプリケーションを介さずにHttpServer
常に 100 ステータス コードで応答します。ソースを見る:
/* check if client sent an Expect 100 Continue.
* In that case, need to send an interim response.
* In future API may be modified to allow app to
* be involved in this process.
*/
String exp = headers.getFirst("Expect");
if (exp != null && exp.equalsIgnoreCase ("100-continue")) {
logReply (100, requestLine, null);
sendReply (
Code.HTTP_CONTINUE, false, null
);
}
アプリケーションが関与していない場合、そのメッセージを送信するのは不適切であることをクライアントに伝えることができないように思われるため、プロトコルに違反しています (これは、接続が早期に閉じられたり、パイプが壊れたりするなどの問題につながります)。何かが足りない場合に備えて、この解釈が正しいかどうかコミュニティに尋ねたほうがいいです:)