Closed alhyss closed 8 months ago
Analyse Dans le cas où la méthode contentAsString() de l'objet QgsNetworkContentFetcher ne renvoie rien, [QgsNetworkContentFetcher.reply()| retourne None. On ne peut donc pas retourner les méthodes error() et errorString()
On en parle ?
Je reviens sur ma position, [QgsNetworkContentFetcher.reply()| ne retourne pas None et donc, on peut capturer les erreurs
Résultat ci-dessous
Pour mémoire, la solution mise en oeuvre ne fonctionne que sur les erreurs HTTP (page introuvable, délai de réponse du serveur dépassé, etc.). Si les paramètres de la requête ne sont pas bons, notamment l'identifiant de la fiche de métadonnées, le CSW renvoie un XML certes sans métadonnées, mais qui contient tout de même un élément csw:GetRecordByIdResponse
. Vérifier si la méthode QgsNetworkContentFetcher.contentAsString
renvoie une chaîne de caractères vides n'est donc pas suffisant.
À noter que la version 3 du protocole CSW prévoit de renvoyer une erreur HTTP 400 dans ce cas (Bad request), mais ce n'était pas le cas avec la version 2.0.2 prise en charge par Plume.
Correction
#===============================
def returnXml(self, url_csw, file_identifier) :
resultQueryId = csw.getrecordbyid_request(url_csw, file_identifier)
url = QUrl(resultQueryId)
fetcher = QgsNetworkContentFetcher()
fetcher.fetchContent(url)
#-
evloop = QEventLoop()
fetcher.finished.connect(evloop.quit)
evloop.exec_(QEventLoop.ExcludeUserInputEvents)
fetcher.finished.disconnect(evloop.quit)
#-
raw_xml = [ fetcher.contentAsString() ]
#- Cas ou le serveur CSW ne renvoie rien https://github.com/MTES-MCT/metadata-postgresql/issues/146
if raw_xml[0] == "" :
ret = fetcher.reply()
raw_xml = [ None, str(ret.error()), str(ret.errorString()) ]
#- Cas ou le serveur CSW renvoie <csw:GetRecordByIdResponse sans balises à l'intérieur https://github.com/MTES-MCT/metadata-postgresql/issues/146
elif not self.return_children_xml( raw_xml[0] ) :
raw_xml = [ None, "99", str("Problème d'identifiant.") ]
#-
return raw_xml
#===============================
def return_children_xml(self, reponse_xml) :
_return_children_xml = False
# Analyser la réponse XML
root = ET.fromstring(reponse_xml)
children = list(root)
if children:
for child in children:
_return_children_xml = True
break
return _return_children_xml
Avec en retour le message suivant
Actuellement, la méthode
Ui_Dialog_ImportCSW.returnXml()
du moduleplume.importcsw
n'avertit pas l'utilisateur lorsque le CSW a renvoyé une erreur. Dans ce cas, la méthodecontentAsString()
de l'objetQgsNetworkContentFetcher
ne renvoie rien et, selon l'option d'import choisie par l'utilisateur, la fiche de métadonnées sera soit laissée intacte, soit entièrement vidée, sans que l'utilisateur ne sache pourquoi.https://github.com/MTES-MCT/metadata-postgresql/blob/7f7818eb8c1b7884c8c495d6d49488c1c7eb7502/plume/importcsw.py#L365
Il n'y a aucune dysfonctionnement de Plume, mais l'utilisateur n'a aucune information pour l'aider à diagnostiquer le problème (si tant est qu'il remarque qu'il y en a un), qui peut aller du proxy mal configuré empêchant la connexion à internet à une coquille dans l'identifiant de la fiche de métadonnées.
La méthode
QgsNetworkContentFetcher.reply()
fournit un objetQNetworkReply
, sur lequel il est possible d'appliquer les méthodeserror()
eterrorString()
pour accéder aux informations sur les erreurs rencontrées. Il serait utile de les utiliser pour détecter les erreurs et afficher alors un message à l'utilisateur avec la description de l'erreur.