Bug #20523
crash 500 lors de l'affichage d'une source de donnée avec une mauvaise URL
0%
Description
Une source de données avec une URL "/csvdatasource/services/data" donne cette trace 500 quand elle est affichée :
Exception: type = '<type 'exceptions.TypeError'>', value = 'argument of type 'NoneType' is not iterable' Stack trace (most recent call first): File "/usr/lib/python2.7/dist-packages/wcs/qommon/misc.py", line 284, in _http_request 282 283 auth = None > 284 if '@' in hostname: 285 authenticator, hostname = hostname.split('@') 286 if ':' in authenticator: locals: body = None url = '/csvdatasource/services/data' cert_file = None hostname = None auth = None raise_on_http_errors = True headers = {} timeout = None query = 'tasource/services/data' method = 'GET' File "/usr/lib/python2.7/dist-packages/wcs/qommon/misc.py", line 314, in urlopen 312 url, 'GET' if data is None else 'POST', 313 body=data, > 314 raise_on_http_errors=True) 315 return StringIO(data) 316 locals: url = '/csvdatasource/services/data' data = None File "/usr/lib/python2.7/dist-packages/wcs/data_sources.py", line 183, in get_structured_items 181 get_logger().warn('Error loading JSON data source (%s)' % str(e)) 182 except ValueError as e: > 183 get_logger().warn('Error reading JSON data source output (%s)' % str(e)) 184 return [] 185 locals: url = '/csvdatasource/services/data' data_source = {'type': 'json', 'value': '/csvdatasource/services/data'} File "/usr/lib/python2.7/dist-packages/wcs/admin/data_sources.py", line 128, in _q_index 126 127 if data_source_type in ('json', 'formula'): > 128 items = get_structured_items(self.datasource.data_source) 129 if items: 130 r += htmltext('<h3>%s</h3>') % _('Preview (first items only)') ...
Fichiers
Révisions associées
Historique
Mis à jour par Thomas Noël il y a plus de 6 ans
Il y a mystère pour moi ici, car rien ne plante si j'ajoute ceci à tests/test_admin_pages.py
3890 def test_data_sources_view(pub): ... 3947 data_source.data_source = {'type': 'json', 'value': '/csvdatasource/services/data'} 3948 data_source.store() 3949 resp = app.get('/backoffice/settings/data-sources/%s/' % data_source.id)
Mis à jour par Benjamin Dauvergne il y a plus de 6 ans
N'y aurait pas remplacement de _http_request dans les tests ? pour mocker les réponses.
Dans tous les cas faut réécrire ça:
if url.startswith('http://'): hostname, query = urllib.splithost(url[5:]) else: hostname, query = urllib.splithost(url[6:])
sur la base de urlparse.urlparse
, c'est juste pas bon comme code.
Mis à jour par Thomas Noël il y a plus de 6 ans
Benjamin Dauvergne a écrit :
N'y aurait pas remplacement de _http_request dans les tests ? pour mocker les réponses.
C'est bien possible mais par quelle magie ? Je ne vois rien dans test_admin_pages.py qui parle de mocker quoi que ce soit...
Dans tous les cas faut réécrire ça:
(...)
sur la base deurlparse.urlparse
, c'est juste pas bon comme code.
Oui, après avoir corrigé ça, c'est en cherchant à écrire un test que je bloque.
Mis à jour par Benjamin Dauvergne il y a plus de 6 ans
Thomas Noël a écrit :
Benjamin Dauvergne a écrit :
N'y aurait pas remplacement de _http_request dans les tests ? pour mocker les réponses.
C'est bien possible mais par quelle magie ? Je ne vois rien dans test_admin_pages.py qui parle de mocker quoi que ce soit...
C'est global ça ne passe pas par une fixture (!?!, #16509 c'est corrigé depuis longtemps, je suis un peu malheureux avec mes tickets).
Dans tous les cas faut réécrire ça:
(...)
sur la base deurlparse.urlparse
, c'est juste pas bon comme code.Oui, après avoir corrigé ça, c'est en cherchant à écrire un test que je bloque.
Ben intègre le #16509 et tu pourras.
Mis à jour par Thomas Noël il y a plus de 6 ans
- Fichier 0001-misc-accept-only-http-and-https-as-URL-scheme-20523.patch 0001-misc-accept-only-http-and-https-as-URL-scheme-20523.patch ajouté
- Statut changé de Nouveau à En cours
- Patch proposed changé de Non à Oui
Après #16509 on peut donc avoir le patch ci-joint
Mis à jour par Thomas Noël il y a plus de 6 ans
- Priorité changé de Normal à Haut
Bogue grave : le problème remonte y compris sur l'affichage backoffice d'un formulaire où un champ fait référence à une telle source de données. Ce qui peut facilement arriver, typiquement une source de donnée avec une URL [form_var_chose] où la variable n'existe pas encore...
Mis à jour par Benjamin Dauvergne il y a plus de 6 ans
Ack, idéalement il faudrait valider qu'on obtient un début d'URL dans wcs.data_sources.DataSourceSelectionWidget quand on choisit JSON ou JSONP, je te laisse ouvrir un ticket si ça te semble pertinent.
Mis à jour par Thomas Noël il y a plus de 6 ans
Benjamin Dauvergne a écrit :
Ack, idéalement il faudrait valider qu'on obtient un début d'URL dans wcs.data_sources.DataSourceSelectionWidget quand on choisit JSON ou JSONP, je te laisse ouvrir un ticket si ça te semble pertinent.
Pas vraiment parce que l'URL peut être une [form_var...] qui dépend d'une variable d'un formulaire, et ne sera résolue que dans ce contexte. C'est même, la plupart du temps, ce qui donne l'erreur 500 qui est ici contournée.
Mis à jour par Thomas Noël il y a plus de 6 ans
- Statut changé de En cours à Résolu (à déployer)
commit ad6849f523ff512dc8c7226fad45fd132ddbc31f (HEAD -> master) Author: Thomas NOEL <tnoel@entrouvert.com> Date: Fri Dec 8 16:19:04 2017 +0100 misc: accept only http and https as URL scheme (#20523)
Mis à jour par Benjamin Dauvergne il y a plus de 6 ans
Thomas Noël a écrit :
Benjamin Dauvergne a écrit :
Ack, idéalement il faudrait valider qu'on obtient un début d'URL dans wcs.data_sources.DataSourceSelectionWidget quand on choisit JSON ou JSONP, je te laisse ouvrir un ticket si ça te semble pertinent.
Pas vraiment parce que l'URL peut être une [form_var...] qui dépend d'une variable d'un formulaire, et ne sera résolue que dans ce contexte. C'est même, la plupart du temps, ce qui donne l'erreur 500 qui est ici contournée.
En général le début de l'URL c'est plutôt [passerelle_url] qui est toujours disponible, a-t-on un seul cas ou la partie host de l'URL dépend du formulaire ?
Mis à jour par Thomas Noël il y a plus de 6 ans
Benjamin Dauvergne a écrit :
En général le début de l'URL c'est plutôt [passerelle_url] qui est toujours disponible, a-t-on un seul cas ou la partie host de l'URL dépend du formulaire ?
Oui, pour les réservations et rendez-vous, après le choix d'un type de rdv on affiche la liste des dispos avec [form_var_type_rdv_url] (c'est même une des raisons de l'envoi de ce patch en hotfix)
Mis à jour par Frédéric Péters il y a plus de 5 ans
- Statut changé de Résolu (à déployer) à Solution déployée
misc: accept only http and https as URL scheme (#20523)