Projet

Général

Profil

Bug #52006

base-adresse: ne pas renvoyer de 500 en cas de connexion impossible avec la cible

Ajouté par Thomas Noël il y a environ 3 ans. Mis à jour il y a environ 3 ans.

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

0%

Temps estimé:
Patch proposed:
Oui
Planning:
Non

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

Révision 12440ac6 (diff)
Ajouté par Nicolas Roche il y a environ 3 ans

base_adresse: return 200 on connection error (#52006)

Historique

#1

Mis à jour par Nicolas Roche il y a environ 3 ans

  • Assigné à mis à Nicolas Roche
#2

Mis à jour par Nicolas Roche il y a environ 3 ans

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)")))

#3

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

Je pensais plutôt à un log_requests_errors=False ?

#4

Mis à jour par Nicolas Roche il y a environ 3 ans

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").

#5

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 ?

#6

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)

#7

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)

#9

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.

#10

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))
#12

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

  • Statut changé de Solution proposée à Solution validée
#13

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)
#14

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

Formats disponibles : Atom PDF