web-dev-qa-db-fra.com

NodeJS - https - TypeError [ERR_INVALID_HTTP_TOKEN]: le nom de l'en-tête doit être un jeton HTTP valide ["Accept"]

J'ai un code NodeJS qui utilise le module https comme: https.request(options, (res) => {......options est un objet comme

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

Mes problèmes commencent lorsque j'ajoute l'en-tête Accept. J'obtiens une erreur:

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)

Comment l'en-tête Accept serait-il invalide?

6
bensiu

Je n'ai pas mangé à cause de votre question T_T

Comme @hlfrmn l'a dit, vous avez un caractère rare dans votre mot d'acceptation !!

J'ai reproduit l'erreur:

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

Si vous essayez avec copiedOptions , vous obtiendrez la même erreur.


Depuis Node v10.20.1

Recherche dans https://github.com/nodejs/node/tree/master et le stackTrace: _ http_outgoing.js: 472

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

J'ai fondé ceci:

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

Cette expression régulière garantit que le nom de l'en-tête n'a autorisé que les jetons ou les caractères selon https://tools.ietf.org/html/rfc7230#section-3.2.6

Peut-être qu'une validation antérieure dans le noyau de nodejs pourrait aider:

Vous avez un caractère non autorisé dans votre nom d'en-tête!

1
JRichardsz