クライアントはリクエストを送った後、接続を切断せずにサーバからのレスポンスを待ちます。接続が閉じられていませんから、サーバ側でいくらread()
してもEOF
は返ってきません。
POSTリクエストの場合、リクエストボディの長さがわからなければ、サーバはいつまでもリクエストボディの読み込みを続けてしまいます。そのため、Content-Length
リクエストフィールドの値を見て、必要な長さだけ読み込んだらリクエストの読み込みが終わったと判断しているのだと考えられます。
一方で、クライアントがリクエストを送っている最中に接続が切れてしまうことはありえますから、EOF
を返すかどうかも検査する必要があります。
補足
具体的なコードが示されないので、想像で補足しておきます。
たとえば、IOUtils
クラスにこんなコードがあります (Tomcat 8.5.11で確認しましたが、以前のバージョンでも同様でしょう)。
java
1public static int read(final InputStream input, final byte[] buffer, final int offset, final int length) throws IOException {
2...
3 int remaining = length;
4 while (remaining > 0) {
5 final int location = length - remaining;
6 final int count = input.read(buffer, offset + location, remaining);
7 if (EOF == count) { // EOF
8 break;
9 }
10 remaining -= count;
11 }
12 return length - remaining;
13}
14
このメソッドを使ってリクエストボディを読み込むには、length
引数に正の値を指定しなければなりません。
リクエストの読み込みが終わればinput.read()
はEOF
を返す (上述の通り実際は違います) ので、length
を使わずに次のように書けばいいではないか、というのがご質問の趣旨だと思います。
java
1...
2 int location = 0;
3 while (1) {
4 final int count = input.read(buffer, offset + location, READSIZE);
5 if (EOF == count) { // EOF
6 break;
7 }
8 location += count;
9 }
10 return location;
11...