[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 メーリングリストの案内