Request: Échec de JSON.parse à cause du caractère BOM

Créé le 5 janv. 2018  ·  3Commentaires  ·  Source: request/request

Sommaire

La nomenclature n'est pas supprimée du corps de la réponse lorsque le corps est rempli avec le tampon

Exemple le plus simple à reproduire

    request({
        url: url,
        json: true,
        strictSSL: false,
    }, (error, response, data) => {
        if (error) {
            throw error;
        }

        if (response.statusCode === 200) {
            // data is string instead of json deserialized object 
        }
    })

Comportement prévisible

BOM char dépouillé et réponse json désérialisée

Comportement actuel

JSON.parse échoue et une chaîne est renvoyée

Solution possible

    if (bufferLength) {
      debug('has body', self.uri.href, bufferLength)
      response.body = Buffer.concat(buffers, bufferLength)
      if (self.encoding !== null) {
        response.body = response.body.toString(self.encoding)
      }
      // `buffer` is defined in the parent scope and used in a closure it exists for the life of the Request.
      // This can lead to leaky behavior if the user retains a reference to the request object.
      buffers = []
      bufferLength = 0
    } else if (strings.length) {
      // The UTF8 BOM [0xEF,0xBB,0xBF] is converted to [0xFE,0xFF] in the JS UTC16/UCS2 representation.
      // Strip this value out when the encoding is set to 'utf8', as upstream consumers won't expect it and it breaks JSON.parse().
      if (self.encoding === 'utf8' && strings[0].length > 0 && strings[0][0] === '\uFEFF') {
        strings[0] = strings[0].substring(1)
      }
      response.body = strings.join('')
    }

Comme nous pouvons le voir, le caractère BOM est supprimé lorsque des chaînes sont utilisées à la place du tampon
Extrayez le code en dehors de else if (strings.length) pour toujours nettoyer le corps de la réponse.

Le contexte

Lecture de la réponse json d'un fanfaron personnalisé de l'entreprise basé sur le cape et l'épée

Votre environnement

| logiciel | version
| ---------------- | -------
| demande | 2.83.0
| nœud | 9.3.0
| npm | 5.5.1
| Système d'exploitation | Windows 10

stale

Commentaire le plus utile

Si nous définissons l'encodage : 'utf8' dans les options de la requête, la réponse est analysée

Tous les 3 commentaires

Si nous définissons l'encodage : 'utf8' dans les options de la requête, la réponse est analysée

Ce problème a été automatiquement marqué comme obsolète car il n'a pas eu d'activité récente. Il sera fermé si aucune autre activité ne se produit. Merci pour vos contributions.

Je vois aussi ce problème - merci d'avoir publié la solution de contournement - ce serait bien si la bibliothèque s'occupait de cela.

Cette page vous a été utile?
0 / 5 - 0 notes