Tomcat7.0.55以降でファイルアップロード時にエラーが発生する

Tomcatのマイナーバージョンをアップしたタイミングで大容量のファイルをPOSTした際のエラーハンドリングがうまく効かなくなるケースがありました。

調べたところ、

Tomcat 7.0.54の場合は意図したとおりに動作し、

Tomcat 7.0.55にするとうまく動かなくなりました。

リリースノートを確認してみます。

http://tomcat.apache.org/tomcat-7.0-doc/changelog.html#Tomcat 7.0.55 (violetagg)

Coyote欄にこんな文章が

Fix CVE-2014-0230: Add a new limit, defaulting to 2MB, for the amount of data Tomcat will swallow for an aborted upload. The limit is configurable by maxSwallowSize attribute of an HTTP connector. (markt)
update  Allow to configure maxSwallowSize attribute of an HTTP connector via JMX. (kkolinko)

どうやらパラメータとして新たに「maxSwallowSize」が増えた模様。

https://hacknote.jp/archives/12800/

でも触れたように今までPOSTデータのサイズは「maxPostSize」で調整をしていました。

maxPostSizeは「multipart/form-data」には影響を与えていなかったはずなのですが、なにか処理が変わったのかもしれません。

まだ新しいパラメータのためあまり情報がありませんが、調べてみたところ

http://grokbase.com/t/tomcat/users/148xpwvag8/uploading-large-files-in-tomcat-8-0-9

Setting maxSwallowSize="-1" worked. I didn't need maxPostSize at all.

とあるように、「maxSwallowSize」に「-1」を設定すればもう「maxPostSize」の設定は不要なようです。

vim /etc/tomcat7/server.xml

変更前

    <Connector port="8080" protocol="HTTP/1.1" 
               maxThreads="1000" 
               enableLookups="false" 
               connectionTimeout="20000" 
               redirectPort="8443" maxPostSize="0" />

変更後

    <Connector port="8080" protocol="HTTP/1.1" 
               maxThreads="1000" 
               enableLookups="false" 
               connectionTimeout="20000" 
               redirectPort="8443" maxSwallowSize="-1" />

のように「maxPostSize」の箇所を「maxSwallowSize」に書き換えます。値を「-1」にすれば無制限のようです。

またこの設定値は置き換えをする必要があり、maxPostSizeとmaxSwallowSizeの設定を併記したところ、Tomcatは起動するものの、POSTの処理がうまく動きませんでした。

参考

http://stackoverflow.com/questions/26216335/unable-to-deploy-large-worklight-app-on-tomcat-using-wladm-ant-task