2013-12-17 22 views
6

標準發送大寫的頭說頭不區分大小寫。如何在HTTP

Ruby和節點二者力小寫頭。

我們使用的是預計頭「的authToken」區分大小寫,使用.NET框架的外部服務器程序,顯然都沒有遵循標準。在這種情況下,我們需要頭文件。

回答

4

在寫這篇文章的時候,下面的setHeaderthe _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並使用當前使用的版本覆蓋此方法。

應該然後正常工作。你可以做覆蓋在紅寶石的方法的類似的事情,但它不會是一個快速簡便的

那麼這將工作:

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

編輯:這是爲新版本節點

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; 
    } 
}; 

看起來它調用此本地方法,which'll需要定義以及

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; 
    } 
} 

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

無論如何,請檢查您節點的版本你要重寫

+1

大劈!工作正常,只要你定義自動標題。 [按此例如代碼(https://gist.github.com/Epskampie/11281368) –

+0

評論說,部分出,因爲它是可撤消。 – Funkodebat

+2

我想你應該更新答案節點的最新版本,請參閱https://github.com/nodejs/node/blob/master/lib/_http_outgoing.js –