ライブラリに手を加えたくないけど、動作を変えたい。そんなときは、アスペクト指向ちっくになおしましょう♪
Ajax.Request の setRequestHeaders は Content-type をこちら側で設定できなくて不便である。XML-RPC するときなどは Content-type を text/xml で送りたいじゃないか!ということで修正。
以下のコードを Prototype.js を読み込んだ直後に挿入。
// 元のメソッドを退避 Ajax.Request.prototype._setRequestHeaders = Ajax.Request.prototype.setRequestHeaders; // 新しいメソッドを追加 Ajax.Request.prototype.setRequestHeaders = function() { if (this.options.method == 'post') { // get のように処理させる。 this.options.method = 'get'; // 本来の処理を呼び出す。 Ajax.Request.prototype._setRequestHeaders.apply(this, arguments); // 戻す this.options.method = 'post'; // 本来 POST の場合にすべき動作をさせる。 if(!this.options.requestHeaders.detect(function(header) { return header == 'Content-type'; })) { this.transport.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); } if (this.transport.overrideMimeType) { this.transport.setRequestHeader('Connection', 'close'); } } else { Ajax.Request.prototype._setRequestHeaders._setRequestHeaders.apply(this, arguments); } };
これを使う場合はコメントくらはい。