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