Mochikit で sendXMLHttpRequest する際に Content-Type を設定しないと、CGI.pm で URL エンコードされた POST データを受け取れない
サーバの入れ替えを行う際に、時間を無駄にしたのでメモ。
旧環境では、下記のコードで問題なく動作していたのだが…
// ..snip.. var r = getXMLHttpRequest(); r.open('POST', CGI_PATH, true); var args = formContents('form_id'); this.d = sendXMLHttpRequest(r, queryString(args[0], args[1])); this.d.addCallbacks( bind(this.call_back, this), bind(this.error_back, this) ); // ..snip..
新環境では、CGI.pm を new すると "POSTDATA" というキーにごそっと POST したデータが入ってしまう。
CGI.pm のコードを読んでみると…
if ($meth eq 'POST' && defined($ENV{'CONTENT_TYPE'}) && $ENV{'CONTENT_TYPE'} !~ m|^application/x-www-form-urlencoded| && $ENV{'CONTENT_TYPE'} !~ m|^multipart/form-data| ) { my($param) = 'POSTDATA' ; $self->add_parameter($param) ; push (@{$self->{$param}},$query_string); undef $query_string ; }
どうやら、好きな Parser を指定できるようにするための措置らしい。
"CGI.pm", "POSTDATA" などのキーワードでググると、古い記事が沢山引っかかるので、相当前からの仕様らしい…。
という事で、setRequestHeader を使って "Content-Type" してみた。
// ..snip.. var r = getXMLHttpRequest(); r.open('POST', CGI_PATH, true); r.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); // ..snip..
FireFox の場合、open の前で setRequestHeader するとエラーとなるので注意。
きっと一般的な Perl Web エンジニアの間では常識なんだろうなぁ orz