Jakarta Commons FileUpload の 1.1 で、RFC1867見ながら作ったmultipart/form-dataを送りつけたらFileUploadExceptionで怒られた。
The client might send back the following data:
http://www.ietf.org/rfc/rfc1867.txt
Content-type: multipart/form-data, boundary=AaB03x
--AaB03x
...
--AaB03x--
これをそのままコピペして適当にHTTPのPOSTデータ頭にくっつけて送るプログラムを動かしてみたのだけれど。鯖側のサンプルWebアプリがJakartaCommonsのFileUpload-1.1を使ってて、標題のExceptionで怒られる。
FileUploadException : the request was rejected because no multipart boundary was found
・・・おかしい。
使い慣れたPHPでも受信用のアプリを組んでいて、こちらでは正常に$_FILESに入ってきてる。
で、パケットをよく見てみると・・・
Content-type: multipart/form-data, boundary=AaB03x ^ Σ(゚д゚)
!?・・・これ、";"の間違いじゃないの!?Googleでフレーズ検索しても、出てくるのは";"バージョンばっかなんですが・・・。
まさかと思い、Commons-FileUpload 1.1 のソースを落としてみました。見るべきポイントはFileUploadBaseクラスのgetBoundary()メソッドと見当が付き、見てみると。
protected byte[] getBoundary(String contentType) { // ... Map params = parser.parse(contentType, ';'); ^ Σ(゚д゚lll)
やられた・・・。
ちなみに、","が認識されるのは 1.2.1 になってからのようです。気になって、1.1からの最新リリース迄("1.1", "1.1.1", "1.2", "1.2.1")のソースコードをDLして確認したのですが、1.2.1になってようやく
Map params = parser.parse(contentType, new char[] {';', ','});
となっています。*1
というわけで、Commons-FileUploadの1.2.1未満をWebアプリで使っている場合、プログラム組んで手動でHTTPヘッダ組み立ててRFC1867で送信する時は、";"を使わないと駄目ですよー、という話でした。