如何在HTTP中发送UpperCase头

标准说头是不区分大小写的。

Ruby和node都强制小写头。

我们正在使用一个外部的服务器程序,期望头文件“AuthToken”是区分大小写的,使用.NET框架,显然两者都不遵循标准。 在这种情况下,我们需要头文件。

在写setHeader文章的时候,下面的setHeader是从节点核心库的_http_outgoing页面复制的

 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'}}) 

编辑:这里是新版本的节点

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

看起来像是调用这个本地方法,这也需要被定义

 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'); 

无论如何,检查你的版本节点,你是压倒一切的