From 80d28f71a7f9af96b792b6381ad0eec12bd2d302 Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Fri, 15 Dec 2017 20:54:52 +0100 Subject: [PATCH] opengis: correctly handle XML formatted OpenGIS errors (#20754) --- passerelle/apps/opengis/models.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/passerelle/apps/opengis/models.py b/passerelle/apps/opengis/models.py index f47f31a..781c034 100644 --- a/passerelle/apps/opengis/models.py +++ b/passerelle/apps/opengis/models.py @@ -16,6 +16,7 @@ import math import xml.etree.ElementTree as ET +from HTMLParser import HTMLParser import pyproj @@ -101,11 +102,37 @@ class OpenGIS(BaseResource): params['CQL_FILTER'] += ' AND %s %s \'%%%s%%\'' % (filter_property_name, operator, q) response = self.requests.get(self.wfs_service_url, params=params) data = [] + try: + json_result = response.json() + except ValueError: + self.handle_opengis_error(response) + # if handle_opengis_error did not raise an error, we raise a generic one + raise APIError(u'OpenGIS Error: unparsable error', + data={'content': repr(response.content[:1024])}) for feature in response.json()['features']: feature['text'] = feature['properties'].get(property_name) data.append(feature) return {'data': data} + def handle_opengis_error(self, response): + try: + root = ET.fromstring(response.content) + except ET.ParseError: + return None + if root.tag != '{http://www.opengis.net/ows/1.1}ExceptionReport': + return None + exception = root.find('{http://www.opengis.net/ows/1.1}Exception') + exception_code = exception.attrib.get('exceptionCode') + if exception is None: + return None + exception_text = exception.find('{http://www.opengis.net/ows/1.1}ExceptionText') + if exception_text is None: + return None + content = exception_text.text + htmlparser = HTMLParser() + content = htmlparser.unescape(content) + raise APIError(u'OpenGIS Error: %s' % exception_code or 'unknown code', + data={'text': content}) @endpoint(perm='can_access', description=_('Get feature info'), -- 1.7.10.4