[Seasar-user:19552] Re: [SAStruts] SizeLimitExceededException 発生時のレスポンスについて

田嶋隆寿 [E-MAIL ADDRESS DELETED]
2010年 3月 25日 (木) 14:01:22 JST


田嶋です。
いつもお世話になっております。

> 小林 (koichik) です.
>
> 問題の現象が起きている状態でブラウザの
> ステータスラインを見ると,ファイルの
> アップロードが終了していないことが分かります.
> # ただし maxFileSize が 1024byte などと小さく,
> # アップロードするファイルもそれより少し大きい
> # 程度だと問題になりません.
> # TCP のフロー制御が行われるサイズに関係?
>
> その時サーバ側では既に処理を終えてレスポンスを
> 返しているのですが,ブラウザはリクエストの
> 送信中のため,レスポンスを受信しないという
> 状態です.
> # こちらも同様にレスポンスのサイズが小さいと
> # 画面は表示されますが,ブラウザはリクエストを
> # 送信中のままです.
>
> これは commons-fileupload が SizeLimitExceededException
> をスローした際に,リクエストの残りを読み取らず
> 放置しているために起きていると思われます.

commons-fileuploadが問題でしたか。
サーバーがレスポンスを返しているのに、
クライアントが受信していないという状態だったのですね。

> とりあえず,S2MultipartRequestHandler の
>
>        } catch (SizeLimitExceededException e) {
>            request.setAttribute(
>                    MultipartRequestHandler.ATTRIBUTE_MAX_LENGTH_EXCEEDED,
>                    Boolean.TRUE);
>            request.setAttribute(SIZE_EXCEPTION_KEY, e);
>
> の後に
>
>            try {
>                InputStream is = request.getInputStream();
>                try {
>                    byte[] buf = new byte[1024];
>                    int len = 0;
>                    while ((len = is.read(buf)) != -1) {
>                    }
>                } catch (Exception ignore) {
>                } finally {
>                    try {
>                        is.close();
>                    } catch (Exception ignore) {
>                    }
>                }
>            } catch (Exception ignore) {
>            }
>
> を追加したところ解決しました.

同様のコードを書くことで当方でも解決いたしました。
小林様、ありがとうございます。

> ひがです。
>
> SAStrutsは修正しておきます。

ひがさま、ありがとうございます。
SAStrutsのバージョンアップを期待してお待ちしております。


Seasar-user メーリングリストの案内