Bug #52006
base-adresse: ne pas renvoyer de 500 en cas de connexion impossible avec la cible
0%
Description
Il arrive que le geolocalisateur ne réponde pas, on arrive sur une requests.exceptions.ConnectionError et dans ce cas le connecteur renvoie une erreur 500 avec ce JSON :
{"err": 1, "err_class": "requests.exceptions.ConnectionError", "err_desc": "(\'Connection aborted.\', RemoteDisconnected(\'Remote end closed connection without response\'))", "data": null}
Il faudrait plutôt répondre une 200 (passerelle n'a pas crashé).
Fichiers
Révisions associées
Historique
Mis à jour par Nicolas Roche il y a environ 3 ans
- Fichier 0001-base_adresse-return-200-on-connection-error-52006.patch 0001-base_adresse-return-200-on-connection-error-52006.patch ajouté
- Statut changé de Nouveau à Solution proposée
- Patch proposed changé de Non à Oui
J'ai trouvé cette trace côté w.c.s qui fait l'appel suivant :
https://passerelle.montpellier3m.fr/base-adresse/ban/reverse?zoom=18&format=json&addressdetails=1&lat=43.593&lon=3.8574&accept-language=fr
Dans les logs du connecteur on retrouve (à mon avis) l'exception donnée dans la decription du ticket :
GET https://api-adresse.data.gouv.fr/reverse/?lat=43.593&lon=3.8574 (=> ReadTimeout(ReadTimeoutError("HTTPSConnectionPool(host='api-adresse.data.gouv.fr', port=443): Read timed out. (read timeout=25)")))
Mis à jour par Thomas Noël il y a environ 3 ans
Je pensais plutôt à un log_requests_errors=False ?
Mis à jour par Nicolas Roche il y a environ 3 ans
- Fichier 0001-base_adresse-return-200-on-connection-error-52006.patch 0001-base_adresse-return-200-on-connection-error-52006.patch ajouté
Fait, mais ça renverra une 500, et continuera à faire planter le cron
(dans l'entête du ticket tu spécifiais : "plutôt répondre une 200").
Mis à jour par Thomas Noël il y a environ 3 ans
Nicolas Roche a écrit :
Fait, mais ça renverra une 500, et continuera à faire planter le cron
(dans l'entête du ticket tu spécifiais : "plutôt répondre une 200").
J'ai la tête ailleurs, je ne comprends plus le code de Passerelle... c'est le self.requests qui provoque une exception en cas de 500 ?
Mis à jour par Nicolas Roche il y a environ 3 ans
Oui, simulé ci-dessous avec une URL qui ne répond pas.
/home/nroche/src/passerelle/passerelle/apps/base_adresse/models.py(153)addresses() -> result_response = self.requests.get('https://url-qui-ne-répond-pas/') /home/nroche/envs/publik-env-py3/lib/python3.9/site-packages/requests/sessions.py(555)get() -> return self.request('GET', url, **kwargs) /home/nroche/src/passerelle/passerelle/utils/__init__.py(300)request() -> response = super(Request, self).request(method, url, **kwargs) /home/nroche/envs/publik-env-py3/lib/python3.9/site-packages/requests/sessions.py(542)request() -> resp = self.send(prep, **send_kwargs) /home/nroche/src/passerelle/passerelle/utils/__init__.py(317)send() -> response = super(Request, self).send(request, **kwargs) /home/nroche/envs/publik-env-py3/lib/python3.9/site-packages/requests/sessions.py(655)send() -> r = adapter.send(request, **kwargs) > /home/nroche/envs/publik-env-py3/lib/python3.9/site-packages/requests/adapters.py(516)send() -> raise ConnectionError(e, request=request)
Mis à jour par Thomas Noël il y a environ 3 ans
Ok, donc il faut aussi faire un try/except sur ConnectionError lors du self.request.
Ca sera plus explicite que ce que tu proposais en premier :
try: result_response = self.requests.get(url) result_response.raise_for_status() except RequestException as e: raise APIError('Bad response code from API: %s' % e)
qui "englobait" l'erreur de connexion dans une APIError "bad response" alors que non, y'a pas eu de réponse.
Je propose donc ce schéma :
try: result_response = self.requests.get(url) except ConnectionError as e: raise APIError('Connection error: %s' % e) try; result_response.raise_for_status() except RequestException as e: raise APIError('Bad response code from API: %s' % e)
et donc remettre le log, en fait, c'était pas lui qu'on visait (mes excuses pour l'embrouille)
Mis à jour par Nicolas Roche il y a environ 3 ans
- Fichier 0001-base_adresse-return-200-on-connection-error-52006.patch 0001-base_adresse-return-200-on-connection-error-52006.patch ajouté
alors que non, y'a pas eu de réponse.
yep, bien vu.
Mis à jour par Benjamin Dauvergne il y a environ 3 ans
requests.get(.) ça peut renvoyer quand même n'importe quelle RequestException, pas juste ConnexionError (il me semble), après on peut évidemment spécialiser les except pour le cas ConnexionError.
Mis à jour par Thomas Noël il y a environ 3 ans
Benjamin Dauvergne a écrit :
requests.get(.) ça peut renvoyer quand même n'importe quelle RequestException, pas juste ConnexionError (il me semble), après on peut évidemment spécialiser les except pour le cas ConnexionError.
T'as totalement raison, et d'ailleurs y'a des soucis de connexion qui ne sont pas des ConnectionError (timeout, certif.. voir https://github.com/psf/requests/blob/master/requests/exceptions.py).
Nicolas c'est donc bien RequestException qu'il faut dans le except et donc ta première proposition était la bonne, j'ai honte et il me faut des vacances :) Il faut cependant revoir le message de l'APIError car on couvre plus large que le seul cas de code non-200
Peut-être quelque chose comme :
try: result_response = self.requests.get(url) result_response.raise_for_status() except RequestException as e: raise APIError('failed to get %s: %s' % (url, e))
Mis à jour par Nicolas Roche il y a environ 3 ans
- Fichier 0001-base_adresse-return-200-on-connection-error-52006.patch 0001-base_adresse-return-200-on-connection-error-52006.patch ajouté
Fait.
Mis à jour par Thomas Noël il y a environ 3 ans
- Statut changé de Solution proposée à Solution validée
Mis à jour par Nicolas Roche il y a environ 3 ans
- Statut changé de Solution validée à Résolu (à déployer)
commit 12440ac62b6f3435793f87d21dbbf898ca21a4ef Author: Nicolas ROCHE <nroche@entrouvert.com> Date: Tue Mar 23 10:20:30 2021 +0100 base_adresse: return 200 on connection error (#52006)
Mis à jour par Frédéric Péters il y a environ 3 ans
- Statut changé de Résolu (à déployer) à Solution déployée
base_adresse: return 200 on connection error (#52006)