Project

General

Profile

Development #43201

Ne pas copier les entêtes de réponse tel-quel dans les logs au niveau DEBUG (était: UnicodeDecodeError: 'utf8' codec can't decode byte 0xe9 in position 14: invalid continuation byte)

Added by sentry io 8 days ago. Updated 5 days ago.

Status:
Solution déployée
Priority:
Normal
Target version:
-
Start date:
22 May 2020
Due date:
% Done:

0%

Patch proposed:
Yes
Planning:
No

Description

https://sentry.entrouvert.org/entrouvert/publik/issues/2372/

UnicodeDecodeError: 'utf8' codec can't decode byte 0xe9 in position 14: invalid continuation byte
(27 additional frame(s) were not displayed)
...
  File "psycopg2/_json.py", line 96, in getquoted
    s = self.dumps(self.adapted)
  File "django/contrib/postgres/fields/jsonb.py", line 25, in dumps
    return json.dumps(obj, **options)
  File "__init__.py", line 244, in dumps
    return _default_encoder.encode(obj)
  File "json/encoder.py", line 207, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "json/encoder.py", line 270, in iterencode
    return _iterencode(o, 0)

Error occurred while processing request

0001-misc-log-HTTP-response-headers-safely-43201.patch View (4.09 KB) Benjamin Dauvergne, 22 May 2020 02:11 PM

Associated revisions

Revision b8b864a8 (diff)
Added by Benjamin Dauvergne 5 days ago

misc: log HTTP response headers safely (#43201)

History

#1 Updated by Lauréline Guerin 8 days ago

  • Project changed from Suivi des traces to Passerelle

A priori c'est lié au passage à django jsonfield

#2 Updated by Benjamin Dauvergne 8 days ago

J'ai l'impression que ça n'a rien à voir avec jsonb, c'est dans un simple appel à json.dumps() et le contenu contient visiblement une chaîne bytes qui n'est pas de l'UTF-8; je dirai que c'est le header 'Erreur Webservice' (le nom ne me parait même pas légal).

Erreur WebService : 'Aucun champ clé renseigné : impossible de charger l'objet (gf.tiers.BsTiersDonneesGenerales).   URL: hdnCodeTrt=AFFICHE&CodTrt=Tiers&CodDom=GF&_hdnCodOrg=CG06&_hdnCodBud=01&_hdnCodExe=2020&comboOrganisme=|CG06|', 

ça n'a rien à faire dans un header sans encodage et on les copie sans les décoder ou les vérifier :

# passerelle/utils/__init__.py
189         if logger.level == 10:  # DEBUG
190             extra['response_headers'] = dict(response.headers.items())

durant une petite période le niveau de log DEBUG était activé, ça explique pourquoi on ne voit plus l'erreur :

https://passerelle-departement06.test.entrouvert.org/manage/astregs/associations/logs/?log_level=&q=20%2F05%2F2020+19%3A52#logs

#3 Updated by Benjamin Dauvergne 8 days ago

  • Subject changed from UnicodeDecodeError: 'utf8' codec can't decode byte 0xe9 in position 14: invalid continuation byte to Ne pas copier les entêtes de réponse tel-quel dans les logs au niveau DEBUG (était: UnicodeDecodeError: 'utf8' codec can't decode byte 0xe9 in position 14: invalid continuation byte)

#4 Updated by Serghei Mihai 8 days ago

Benjamin Dauvergne a écrit :

durant une petite période le niveau de log DEBUG était activé, ça explique pourquoi on ne voit plus l'erreur :

https://passerelle-departement06.test.entrouvert.org/manage/astregs/associations/logs/?log_level=&q=20%2F05%2F2020+19%3A52#logs

Je plaide coupable, j'avais passé le connecteur en mode debug pour voir les réponses XML à mes requetes.

#5 Updated by Benjamin Dauvergne 8 days ago

Serghei Mihai a écrit :

Je plaide coupable, j'avais passé le connecteur en mode debug pour voir les réponses XML à mes requetes.

T'as rien fait de mal, il y a un bug c'est tout.

#6 Updated by Benjamin Dauvergne 8 days ago

  • Assignee set to Benjamin Dauvergne

#7 Updated by Benjamin Dauvergne 8 days ago

#8 Updated by Nicolas Roche 6 days ago

  • Status changed from Solution proposée to Solution validée

... c'est dans un simple appel à json.dumps() et le contenu contient visiblement une chaîne bytes qui n'est pas de l'UTF-8;

Je reproduis bien l'erreur :

$ python2
>>> import json
>>> json.dumps({'coucou': b'\xe9'})
Traceback (most recent call last):
  File "/usr/lib/python2.7/json/__init__.py", line 244, in dumps
    return _default_encoder.encode(obj)
  File "/usr/lib/python2.7/json/encoder.py", line 207, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/usr/lib/python2.7/json/encoder.py", line 270, in iterencode
    return _iterencode(o, 0)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xe9 in position 0: unexpected end of data

Je plaide coupable, j'avais passé le connecteur en mode debug

et donc ça va dans le sens de l'analyse faite ici.

#9 Updated by Benjamin Dauvergne 5 days ago

  • Status changed from Solution validée to Résolu (à déployer)
commit b8b864a863042e8dd2d3f7f75d36e055e3ec8ddf
Author: Benjamin Dauvergne <bdauvergne@entrouvert.com>
Date:   Fri May 22 14:10:54 2020 +0200

    misc: log HTTP response headers safely (#43201)

#10 Updated by Frédéric Péters 5 days ago

  • Status changed from Résolu (à déployer) to Solution déployée

Also available in: Atom PDF