Project

General

Profile

Development #38130

UnicodeEncodeError at /dpark/parking/link/

Added by Nicolas Roche 8 months ago. Updated 6 months ago.

Status:
Solution déployée
Priority:
Normal
Target version:
-
Start date:
02 Dec 2019
Due date:
% Done:

0%

Patch proposed:
Yes
Planning:
No

Description

(à priori) Problème pour afficher le message d'erreur retourné par DPark.

Exception Type:     UnicodeEncodeError
Exception Value:     'ascii' codec can't encode character u'\xe9' in position 47: ordinal not in range(128)
Exception Location:     /usr/lib/python2.7/dist-packages/passerelle/contrib/dpark/models.py in call, line 205

args :
(<WSGIRequest: POST '/dpark/parking/link/?orig=demarches-montoulouse.eservices.toulouse-metropole.fr&algo=sha256&timestamp=2019-12-02T13%3A12%3A58Z&nonce=5fd51e97dd1566faf252dc13427f8278&signature=QWIxYrfc3anm/17kfE2ur%2BCkqJIdlEzqawQIEVpiPyE%3D'>,)

e :
UnicodeEncodeError('ascii', u"La valeur 'E-6-VMQN504M' ne respecte pas le sch\xe9ma XSD.", 47, 48, 'ordinal not in range(128)')

extras :
{'body': '\'{"lastname": "LANNELONGUE", "cardnumber": "", "firstnames": "VINCENT", "badgenumber": "", "filenumber": "E-6-VMQN504M", "nameid": "8da5dc154c544647ba33cc9d84db88b7"}\'',
 'exception': u"'ascii' codec can't encode character u'\\xe9' in position 47: ordinal not in range(128)",

Avec un peu de chance c'est déjà résolu par #37880

0001-dpark-accept-error-message-containing-latin1-38130.patch View (2.58 KB) Nicolas Roche, 19 Dec 2019 04:11 PM

0001-dpark-use-only-unicode-strings-38130.patch View (2.03 KB) Benjamin Dauvergne, 16 Jan 2020 12:08 AM

Associated revisions

Revision 821cc213 (diff)
Added by Nicolas Roche 6 months ago

dpark: use only unicode strings (#38130)

History

#1 Updated by Thomas Noël 8 months ago

L'erreur se produit ligne 205 :

    198     def call(self, operation, *args, **kwargs):
    199         client = get_client(self)
    200         proxy_service = client.create_service(SERVICE_BINDING, self.operation_url)
    201         bypass_erroneous_reply = kwargs.pop('bypass_erroneous_reply', False)
    202         try:
    203             reply = getattr(proxy_service, operation)(*args, **kwargs)
    204         except (WebFault, ) as exc:
    205             raise APIError('ServiceError: %s' % exc.message)
    206         except (Exception,) as exc:
    207             raise APIError('Error: %s' % exc.message)
    208         reply_code = getattr(reply, 'CodeRetour', None) or getattr(reply, 'Code_Retour', None)
    209         reply_message = getattr(reply, 'MessageRetour', None) or getattr(reply, 'Lib_Retour', None)
    210         if reply_code != '01' and not bypass_erroneous_reply:
    211             raise APIError(reply_message)
    212         return reply

C'est DPark qui n'est pas content et renvoie le message avec un encodage latin1. Il faudrait peut-être passer à %r sur les exc.message.

#2 Updated by Benjamin Dauvergne 7 months ago

force_text(exc.message , 'latin1', error='ignore')

#3 Updated by Nicolas Roche 7 months ago

J'avoue que j'ai du mal à comprendre :
  • si dans le test je met "éêè" à la place de u"éêè", je n'ai plus l'erreur
  • et si je met u"éêè".encode('latin_1'), alors j'ai DjangoUnicodeDecodeError au décodage

Néanmoins, je pense avoir réussi à reproduire l'erreur de la trace.

#4 Updated by Thomas Noël 6 months ago

(je suis perdu dans la compréhension du code et du test, l'encodage et moi... je passe la main)

#5 Updated by Benjamin Dauvergne 6 months ago

  • Status changed from Solution proposée to En cours

Thomas Noël a écrit :

(je suis perdu dans la compréhension du code et du test, l'encodage et moi... je passe la main)

En fait c'est ton analyse initiale qui est mauvaise, il n'y a pas de latin1 ici, zeep décode bien le message et en fait de l'unicode, c'est juste qu'on fait un

'%s' % exc
et Exception ne gère pas ça :
>>> str(Exception(u'é'))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 0: ordinal not in range(128)

Un simple

% exc.message
suffira.

#6 Updated by Benjamin Dauvergne 6 months ago

  • Assignee set to Benjamin Dauvergne

#7 Updated by Benjamin Dauvergne 6 months ago

Voilà on passe tout en unicode et ça marche mieux (en entrée on a que de l'unicode et en sortie aussi via zeep), et afficher une exception avec de l'unicode dans une chaîne unicode ça marche par contre.

#8 Updated by Nicolas Roche 6 months ago

Je ne connaissais pas https://python-future.org/unicode_literals.html
ça fait le job, et ça corrige mon oubli sur la seconde exception.
Pour moi c'est bon, mais je laisse la main.

#9 Updated by Thomas Noël 6 months ago

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

#10 Updated by Benjamin Dauvergne 6 months ago

  • Status changed from Solution validée to Résolu (à déployer)
commit 19694e1a47ee1082876cc37b5e400bd05309a3f5
Author: Nicolas ROCHE <nroche@entrouvert.com>
Date:   Thu Dec 19 15:57:27 2019 +0100

    dpark: use only unicode strings (#38130)

#11 Updated by Frédéric Péters 6 months ago

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

Also available in: Atom PDF