ぐらめぬ・ぜぷつぇんのはてダ(2007 to 2011)

2007年~2011年ごろまで はてなダイアリー に書いてた記事を引っ越してきました。

Jakarta Commons FileUpload の 1.1 で、RFC1867見ながら作ったmultipart/form-dataを送りつけたらFileUploadExceptionで怒られた。

The client might send back the following data:
Content-type: multipart/form-data, boundary=AaB03x
--AaB03x
...
--AaB03x--

http://www.ietf.org/rfc/rfc1867.txt

これをそのままコピペして適当に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で送信する時は、";"を使わないと駄目ですよー、という話でした。

*1:ソースコードで確認したまでで、すみません、実際に動かして確認までは取ってないです。