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

Koichi Kobayashi [E-MAIL ADDRESS DELETED]
2010年 3月 24日 (水) 20:00:00 JST


小林 (koichik) です.

Date:    Tue, 23 Mar 2010 16:55:17 +0900
From:    Yasuo Higa <[E-MAIL ADDRESS DELETED]>
To:      [E-MAIL ADDRESS DELETED]
Subject: [Seasar-user:19538] Re: [SAStruts] SizeLimitExceededException 発生時のレスポンスについて

> SAStrutsとStrutsは関係なくて、commons-fileuploadは
> もしかしたら関係がある、Tomcatかブラウザが一番関係してる
> 可能性が高いって感じだと思います。

commons-fileupload の問題... かなぁ.

問題の現象が起きている状態でブラウザの
ステータスラインを見ると,ファイルの
アップロードが終了していないことが分かります.
# ただし maxFileSize が 1024byte などと小さく,
# アップロードするファイルもそれより少し大きい
# 程度だと問題になりません.
# TCP のフロー制御が行われるサイズに関係?

その時サーバ側では既に処理を終えてレスポンスを
返しているのですが,ブラウザはリクエストの
送信中のため,レスポンスを受信しないという
状態です.
# こちらも同様にレスポンスのサイズが小さいと
# 画面は表示されますが,ブラウザはリクエストを
# 送信中のままです.

これは commons-fileupload が SizeLimitExceededException
をスローした際に,リクエストの残りを読み取らず
放置しているために起きていると思われます.

とりあえず,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) {
            }

を追加したところ解決しました.
# Teeda も同じだろうなぁ...


-- 
<component name="koichik">
    <property name="fullName">"Koichi Kobayashi"</property>
    <property name="email">"[E-MAIL ADDRESS DELETED]"</property>
    <property name="blog">"http://d.hatena.ne.jp/koichik"</property>
</component>



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