6
標準では、ヘッダーは大文字と小文字を区別しないと言います。HTTPでUpperCaseヘッダーを送信するには
ルビーとノードは両方とも小文字のヘッダを強制します。
ヘッダーのAuthTokenが.NETフレームワークを使用して大文字と小文字を区別すると予想される外部サーバープログラムを使用していますが、どちらも標準に準拠していないようです。この場合、ヘッダーが必要です。
標準では、ヘッダーは大文字と小文字を区別しないと言います。HTTPでUpperCaseヘッダーを送信するには
ルビーとノードは両方とも小文字のヘッダを強制します。
ヘッダーのAuthTokenが.NETフレームワークを使用して大文字と小文字を区別すると予想される外部サーバープログラムを使用していますが、どちらも標準に準拠していないようです。この場合、ヘッダーが必要です。
あなたはこの問題を取得する場合の執筆時点では、以下の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');
、あなたが
グレートハックをオーバーライドしている何のためにノードのバージョンを確認! autoHeadersを定義する限り、うまく動作します。 [コード例はこちら](https://gist.github.com/Epskampie/11281368) –
は元に戻すことができたので、その部分をコメントしました。 – Funkodebat
最新バージョンのNodeについては、その回答を更新する必要があります。https://github.com/nodejs/node/blob/master/lib/_http_outgoing.jsを参照してください。 –