2013-12-17 17 views
6

標準では、ヘッダーは大文字と小文字を区別しないと言います。HTTPでUpperCaseヘッダーを送信するには

ルビーとノードは両方とも小文字のヘッダを強制します。

ヘッダーのAuthTokenが.NETフレームワークを使用して大文字と小文字を区別すると予想される外部サーバープログラムを使用していますが、どちらも標準に準拠していないようです。この場合、ヘッダーが必要です。

答えて

4

あなたはこの問題を取得する場合の執筆時点では、以下のsetHeaderは小文字

ための一部をコメントアウト the _http_outgoing page of node's core lib

var http = require('http'); 

http.OutgoingMessage.prototype.setHeader = function(name, value) { 
    if (arguments.length < 2) { 
    throw new Error('`name` and `value` are required for setHeader().'); 
    } 

    if (this._header) { 
    throw new Error('Can\'t set headers after they are sent.'); 
    } 

    // NO LOWER CASE 
    var key = name//.toLowerCase(); 
    this._headers = this._headers || {}; 
    this._headerNames = this._headerNames || {}; 
    this._headers[key] = value; 
    this._headerNames[key] = name; 

    // Since we're re-defining the method, we can't use this part anymore 
    //if (automaticHeaders[key]) { 
    // this._removedHeader[key] = false; 
    //} 
}; 

からコピー..だからました。 httpを必要とし、現在使用しているバージョンでこのメソッドをオーバーライドします。

正常に動作するはずです。あなたはRubyでメソッドをオーバーライドするのと同様のことを行うことができ、それができなくなります迅速かつ簡単に

はその後、これは動作します:

require('request') 
request({url: 'http://myurl.com', headers: {UpperCaseWorks: 'Yay'}}) 

EDIT:ここでの新しいバージョンのためですそれは

function validateHeader(name, value) { 
    let err; 
    if (typeof name !== 'string' || !name || !checkIsHttpToken(name)) { 
    err = new errors.TypeError('ERR_INVALID_HTTP_TOKEN', 'Header name', name); 
    } else if (value === undefined) { 
    err = new errors.TypeError('ERR_HTTP_INVALID_HEADER_VALUE', value, name); 
    } else if (checkInvalidHeaderChar(value)) { 
    debug('Header "%s" contains invalid characters', name); 
    err = new errors.TypeError('ERR_INVALID_CHAR', 'header content', name); 
    } 
    if (err !== undefined) { 
    Error.captureStackTrace(err, validateHeader); 
    throw err; 
    } 
} 
同様に定義する必要がwhich'llこのローカルメソッドを呼び出すようにノード

OutgoingMessage.prototype.setHeader = function setHeader(name, value) { 
    if (this._header) { 
    throw new errors.Error('ERR_HTTP_HEADERS_SENT', 'set'); 
    } 
    validateHeader(name, value); 

    if (!this[outHeadersKey]) 
    this[outHeadersKey] = {}; 
// no more lower case 
    const key = name//.toLowerCase(); 
    this[outHeadersKey][key] = [name, value]; 

    switch (key.length) { 
    case 10: 
     if (key === 'connection') 
     this._removedConnection = false; 
     break; 
    case 14: 
     if (key === 'content-length') 
     this._removedContLen = false; 
     break; 
    case 17: 
     if (key === 'transfer-encoding') 
     this._removedTE = false; 
     break; 
    } 
}; 

が見えます

とにかくこの

const { outHeadersKey } = require('internal/http'); 

、あなたが

+1

グレートハックをオーバーライドしている何のためにノードのバージョンを確認! autoHeadersを定義する限り、うまく動作します。 [コード例はこちら](https://gist.github.com/Epskampie/11281368) –

+0

は元に戻すことができたので、その部分をコメントしました。 – Funkodebat

+2

最新バージョンのNodeについては、その回答を更新する必要があります。https://github.com/nodejs/node/blob/master/lib/_http_outgoing.jsを参照してください。 –

関連する問題