如何在HTTP中发送UpperCase标头

Fun*_*bat 6 header http node.js

标准说标题不区分大小写.

Ruby和节点都强制小写标题.

我们正在使用一个外部服务器程序,它希望标题'AuthToken'区分大小写,使用.NET框架,显然两者都不遵循标准.在这种情况下,我们需要标题.

Fun*_*bat 4

在撰写本文时,以下内容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;
  //}
};
Run Code Online (Sandbox Code Playgroud)

注释掉小写部分

所以..如果你遇到这个问题。需要 http 并使用您当前使用的版本覆盖此方法。

然后它应该可以正常工作。你可以做类似的事情来重写 ruby​​ 中的方法,但这不会是一个快速和简单的过程

然后这将起作用:

require('request')
request({url: 'http://myurl.com', headers: {UpperCaseWorks: 'Yay'}})
Run Code Online (Sandbox Code Playgroud)

编辑:这是新版本的节点

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;
  }
};
Run Code Online (Sandbox Code Playgroud)

看起来它调用了这个本地方法,它也需要定义

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;
  }
}
Run Code Online (Sandbox Code Playgroud)

和这个

const { outHeadersKey } = require('internal/http');
Run Code Online (Sandbox Code Playgroud)

无论如何,请检查您的节点版本以了解您要覆盖的内容

  • 我认为您应该更新最新版本 Node 的答案,请参阅 https://github.com/nodejs/node/blob/master/lib/_http_outgoing.js (2认同)