IT戦記

プログラミング、起業などについて書いているプログラマーのブログです😚

Prototype.js の気に食わない箇所をアスペクト指向っぽくなおす

ライブラリに手を加えたくないけど、動作を変えたい。そんなときは、アスペクト指向ちっくになおしましょう♪
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);
    }
};

これを使う場合はコメントくらはい。