web-dev-qa-db-ja.com

NodeJS-https-TypeError [ERR_INVALID_HTTP_TOKEN]:ヘッダー名は有効なHTTPトークンでなければなりません["Accept"]

httpsモジュールを次のように使用するNodeJSコードがあります:https.request(options, (res) => {......ここで、optionsは次のようなオブジェクトです

const options = {
    hostname: SERVICE_HOSTNAME,
    path: BASE_PATH,
    method: 'GET',
    headers: {
        'Content-Type': 'application/json',
        'Accept​': 'application/json',
        ApplicationId,
        Authorization
    }
  };

Acceptヘッダーを追加すると、問題が発生します。エラーが発生しました:

TypeError [ERR_INVALID_HTTP_TOKEN]: Header name must be a valid HTTP token ["Accept​"]
    at ClientRequest.setHeader (_http_outgoing.js:472:3)
    at new ClientRequest (_http_client.js:203:14)
    at Object.request (https.js:289:10)

Acceptヘッダーはどのように無効になりますか?

6
bensiu

あなたの質問T_Tのため私は食べませんでした

@hlfrmnが言ったように、あなたのAccept Wordには珍しいcharがあります!!

私はエラーを再現しました:

const https = require('https');

//copied from Origin question
var copiedOptions = {
  headers: {
    'Content-Type': 'application/json',
    "Accept​": 'application/json'
  }
}

var writedOptions = {
  headers: {
    'Content-Type': 'application/json',
    "Accept": 'application/json'
  }
}

https.get('https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY',writedOptions, (resp) => {
  let data = '';

  // A chunk of data has been recieved.
  resp.on('data', (chunk) => {
    data += chunk;
  });

  // The whole response has been received. Print out the result.
  resp.on('end', () => {
    console.log(JSON.parse(data).explanation);
  });

}).on("error", (err) => {
  console.log("Error: " + err.message);
});

copiedOptionsを使用すると、同じエラーが発生します。


Node v10.20.1

https://github.com/nodejs/node/tree/master およびstackTraceでの検索:_ http_outgoing.js:472

at ClientRequest.setHeader (_http_outgoing.js:472:3)

私はこれを設立しました:

const tokenRegExp = /^[\^_`a-zA-Z\-0-9!#$%&'*+.|~]+$/;
/**
 * Verifies that the given val is a valid HTTP token
 * per the rules defined in RFC 7230
 * See https://tools.ietf.org/html/rfc7230#section-3.2.6
 */
function checkIsHttpToken(val) {
  return tokenRegExp.test(val);
}

その正規表現は、ヘッダー名に https://tools.ietf.org/html/rfc7230#section-3.2.6 に従ってトークンまたは文字のみが許可されていることを確認します

おそらく、nodejsコアの初期の検証が役立つでしょう:

ヘッダー名に許可されていない文字が含まれています!

1
JRichardsz