From b05960d2841f871949a4cdf1933ac47a4b0423ae Mon Sep 17 00:00:00 2001 From: Yung Date: Mon, 9 Jul 2018 11:01:18 -0400 Subject: [PATCH 1/4] fix(regparse): key checking and xml parsing --- services/regparse/ogc.py | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/services/regparse/ogc.py b/services/regparse/ogc.py index af2d222..5f6ae37 100644 --- a/services/regparse/ogc.py +++ b/services/regparse/ogc.py @@ -1,5 +1,5 @@ import requests -from xml.dom import minidom +import xml.etree.ElementTree as ETree """ A WMS "parser" (barely does any parsing at the moment). @@ -69,12 +69,15 @@ def parseCapabilities(capabilties_xml_string): :returns: dict -- the Name, Title, and Queryable values of all layers in the service. """ ret = {} - xmldoc = minidom.parseString(capabilties_xml_string) - for layer in xmldoc.getElementsByTagName('Layer'): - id = layer.getElementsByTagName('Name')[0].firstChild.data - title = layer.getElementsByTagName('Title')[0].firstChild.data - queryable = str2bool(layer.getAttribute('queryable')) - ret[id] = dict(id=id, title=title, queryable=queryable) + xmldoc = ETree.fromstring(capabilties_xml_string) + namespace = xmldoc.tag[0:(xmldoc.tag.index('}') + 1)] + for layer in xmldoc.iter(namespace + 'Layer'): + id = layer.find(namespace + 'Name') + if id != None: + id = id.text + title = layer.find(namespace + 'Title').text + queryable = (layer.attrib)['queryable'] + ret[id] = dict(id=id, title=title, queryable=queryable) return ret @@ -83,7 +86,13 @@ def make_wms_node(req): Parse WMS specific content from a given request """ result = {} - query_service = requests.get(req['service_url'] + '?SERVICE=WMS&REQUEST=GetCapabilities').content + endpoint = req['service_url'] + if '?' in endpoint: + # the provided service url contains a query string + endpoint += '&SERVICE=WMS&REQUEST=GetCapabilities' + else: + endpoint += '?SERVICE=WMS&REQUEST=GetCapabilities' + query_service = requests.get(endpoint).content layer_params = parseCapabilities(query_service) if 'feature_info_format' in req: result['featureInfoMimeType'] = req['feature_info_format'] From e0fff6274ff1286f12f1a8b604e9141c970e7bb8 Mon Sep 17 00:00:00 2001 From: Yung Date: Mon, 9 Jul 2018 11:13:46 -0400 Subject: [PATCH 2/4] fix(style): cond statement --- services/regparse/ogc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/regparse/ogc.py b/services/regparse/ogc.py index 5f6ae37..d9e5975 100644 --- a/services/regparse/ogc.py +++ b/services/regparse/ogc.py @@ -73,7 +73,7 @@ def parseCapabilities(capabilties_xml_string): namespace = xmldoc.tag[0:(xmldoc.tag.index('}') + 1)] for layer in xmldoc.iter(namespace + 'Layer'): id = layer.find(namespace + 'Name') - if id != None: + if id is not None: id = id.text title = layer.find(namespace + 'Title').text queryable = (layer.attrib)['queryable'] From 5c2114b01816ef7e14abfec82ba739154e6507e3 Mon Sep 17 00:00:00 2001 From: Yung Date: Mon, 9 Jul 2018 11:50:15 -0400 Subject: [PATCH 3/4] fix(ogc): put back str2bool --- services/regparse/ogc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/regparse/ogc.py b/services/regparse/ogc.py index d9e5975..f85ca79 100644 --- a/services/regparse/ogc.py +++ b/services/regparse/ogc.py @@ -76,7 +76,7 @@ def parseCapabilities(capabilties_xml_string): if id is not None: id = id.text title = layer.find(namespace + 'Title').text - queryable = (layer.attrib)['queryable'] + queryable = str2bool((layer.attrib)['queryable']) ret[id] = dict(id=id, title=title, queryable=queryable) return ret From 2193fb528b3583288cce17e43b13ae8ac597597b Mon Sep 17 00:00:00 2001 From: Yung Date: Mon, 9 Jul 2018 13:18:53 -0400 Subject: [PATCH 4/4] fix(ogc): case where queryable is missing --- services/regparse/ogc.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/services/regparse/ogc.py b/services/regparse/ogc.py index f85ca79..7d0f9d9 100644 --- a/services/regparse/ogc.py +++ b/services/regparse/ogc.py @@ -57,7 +57,10 @@ def make_v1_wms_node(req, v2_node, config=None): def str2bool(v): - return v.lower() in ("yes", "true", "t", "1") + """ + Convert str to bool. Return False if v is None. + """ + return v is not None and v.lower() in ("yes", "true", "t", "1") def parseCapabilities(capabilties_xml_string): @@ -76,7 +79,7 @@ def parseCapabilities(capabilties_xml_string): if id is not None: id = id.text title = layer.find(namespace + 'Title').text - queryable = str2bool((layer.attrib)['queryable']) + queryable = str2bool(layer.attrib.get('queryable')) ret[id] = dict(id=id, title=title, queryable=queryable) return ret