Projet

Général

Profil

Bug #49943

Les "plus" dans les paramètres de l'URL des sources de données semblent être transformés en espaces (régression)

Ajouté par Nicolas Roche il y a plus de 3 ans. Mis à jour il y a plus de 3 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
-
Version cible:
-
Début:
07 janvier 2021
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Non
Planning:
Non

Description

J'ai une source de donnée :

{{passerelle_url}}solis-afi-mss/recette/children/?email={{form_user_var_email}}

Mon utilisateur à cet email : bmallet+20112020@entrouvert.com
Pour les démarches, la source de donnée est utilisées pour remplir un champ liste et appele passerelle :
endpoint GET /solis-afi-mss/recette/children/?email=bmallet+20112020%40entrouvert.com&orig=wcs.dev.publik.love&algo=sha256&timestamp=2021-01-07T10%3A55%3A09Z&nonce=2c2716cbf1bf9d9dd95afdea7142604f&signature=gnfFPVEkIefnShmZclAT8AvJjdO4OWlUEw861S6DPBg%3D ('')

Sur passerelle, je met un breakpoint dans le endpoint et je m’aperçois que le '+' a été remplacé par un espace.
186          def children(self, request, email):
187              import pdb; pdb.set_trace()
188  ->            children = self.search_from_email(email)[2]
189              return {'data': children}
190      
(Pdb) email
'bmallet 20112020@entrouvert.com'

Si je fait l'appel depuis curl (avec les paramètres qui vont bien parce que j'avais déjà constaté ce problème, mais en voulant débuger avec curl : https://dev.entrouvert.org/issues/48674#note-10) alors on retrouve bien le '+' dans l'adresse email passée au connecteur.
$ curl -G 'https://passerelle.dev.publik.love/solis-afi-mss/recette/children' --data-urlencode 'email=bmallet+20112020@entrouvert.com'

Comme je m'était bien cassé les dents sur ce problème, je suis quasiment certain que cela fonctionnait précédemment (qu'il s'agit d'une régression).

Historique

#1

Mis à jour par Nicolas Roche il y a plus de 3 ans

  • Tracker changé de Development à Bug

(Brice me dit que c'était pratique de pouvoir utiliser ces adresses mails avec un '+' pour tester.)

#2

Mis à jour par Frédéric Péters il y a plus de 3 ans

Un gabarit django {{form_user_var_email}} donnera le contenu, donc, et ce résultat sera utilisé.

La demande c'est un filtre pour faire un urllib.parse.quote ?

#3

Mis à jour par Nicolas Roche il y a plus de 3 ans

Oui tu as raison, le "plus" est bien passé dans l'URL :
https://passerelle-ministere-solidarites-sante.test.entrouvert.org/manage/solis-afi-mss/aides-financieres/logs/?log_id=17148

Localement je vois que le '+' est remplacé par passerelle par un espace.
J'ai essayé d'envoyer le '+' encodé : "bmallet%2B20112020%40entrouvert.com" mais je reçoit toujours un espace dans passerelle.

Dans l'absolu oui, il s'agirait en fait d'une demande pour un filtre pour faire un urllib.parse.quote,
mais je ne suis pas certain que cela fonctionnera (la dernière fois que je me suis frotté à ce problème, même tcpdump ne m'a pas permis de localiser où avait lieu le remplacement).

#4

Mis à jour par Frédéric Péters il y a plus de 3 ans

mais je ne suis pas certain que cela fonctionnera (la dernière fois que je me suis frotté à ce problème, même tcpdump ne m'a pas permis de localiser où avait lieu le remplacement).

?

C'est simplement que + dans une query string représente l'espace, il faut encoder la query string avec urllib.parse.quote, c'est tout.

(il est écrit "régression" mais je ne le crois pas une seconde)

#5

Mis à jour par Nicolas Roche il y a plus de 3 ans

J'ai vraiment constaté que passer un email avec '+' fonctionnait avec w.c.s mais pas avec curl, puis que ça fonctionnait avec la commande curl qui encode l'URL, et à présent que ça ne fonctionne plus avec w.c.s.

Donc oui, plutôt une régression côté passerelle lors de l'interprétation des paramètres passés par un schéma json
(le tcpdump c'était pour comparer ce qui sortait de passerelle en fait).

Du coup peut-être déplacer le ticket dans passerelle, ou le rejeter si ce cas n'impacte personne d'autre.

#6

Mis à jour par Frédéric Péters il y a plus de 3 ans

Si le souhait est de pouvoir envoyer des paramètres dans la query string avec un + dedans, c'est bien dans wcs qu'il faut un filtre pour faire urllib.parse.quote. Au cas où, je parle bien des sources de données, pour les appels webservice il suffit d'utiliser les champs adéquats pour les paramètres. Ce qui me fait dire qu'une autre orientation pour ce ticket pourrait être d'étendre la définition des sources de données pour comme les appels webservice avoir des champs spécifiques pour les paramètres.

#7

Mis à jour par Thomas Noël il y a plus de 3 ans

Essayer avec ?email={{form_user_var_email|urlencode }}

#8

Mis à jour par Frédéric Péters il y a plus de 3 ans

  • Statut changé de Nouveau à Solution déployée

Oh, trop survolé la doc, je n'étais pas tombé sur |urlencode, ça m'a l'air tout à fait ok.

Formats disponibles : Atom PDF