def get_feature_of_interest(self, foi=None, method='Get', **kwargs): try: base_url = self.get_operation_by_name('GetFeatureOfInterest').methods[method]['url'] except: base_url = self.url request = {'service': 'SOS', 'version': self.version, 'request': 'GetFeatureOfInterest'} # Required Fields assert isinstance(foi, str) request['featureOfInterest'] = foi # Optional Fields if kwargs: for kw in kwargs: request[kw]=kwargs[kw] data = urlencode(request) response = openURL(base_url, data, method, username=self.username, password=self.password).read() tr = etree.fromstring(response) if tr.tag == nspath_eval("ows:ExceptionReport", namespaces): raise ows.ExceptionReport(tr) return tr
def __init__(self, url, version='2.0.0', xml=None, username=None, password=None): """Initialize.""" self.url = url self.username = username self.password = password self.version = version self._capabilities = None # Authentication handled by Reader reader = SosCapabilitiesReader(version=self.version, url=self.url, username=self.username, password=self.password) if xml: # read from stored xml self._capabilities = reader.read_string(xml) else: # read from server self._capabilities = reader.read(self.url) # Avoid building metadata if the response is an Exception se = self._capabilities.find( nspath_eval('ows:ExceptionReport', namespaces)) if se is not None: raise ows.ExceptionReport(se) # build metadata objects self._build_metadata()
def _invoke(self): # do HTTP request self.response = util.http_post(self.url, self.request, self.lang, self.timeout) # parse result see if it's XML self._exml = etree.parse(StringIO.StringIO(self.response)) # it's XML. Attempt to decipher whether the XML response is CSW-ish """ valid_xpaths = [ util.nspath_eval('ows:ExceptionReport', namespaces), util.nspath_eval('csw:Capabilities', namespaces), util.nspath_eval('csw:DescribeRecordResponse', namespaces), util.nspath_eval('csw:GetDomainResponse', namespaces), util.nspath_eval('csw:GetRecordsResponse', namespaces), util.nspath_eval('csw:GetRecordByIdResponse', namespaces), util.nspath_eval('csw:HarvestResponse', namespaces), util.nspath_eval('csw:TransactionResponse', namespaces) ] if self._exml.getroot().tag not in valid_xpaths: raise RuntimeError, 'Document is XML, but not CSW-ish' # check if it's an OGC Exception val = self._exml.find(util.nspath_eval('ows:Exception', namespaces)) if val is not None: raise ows.ExceptionReport(self._exml, self.owscommon.namespace) else: self.exceptionreport = None
def get_observation(self, responseFormat=None, offerings=None, observedProperties=None, eventTime=None, method='Get', **kwargs): """ Parameters ---------- format : string Output format. Provide one that is available for all offerings method : string Optional. HTTP DCP method name: Get or Post. Must **kwargs : extra arguments anything else e.g. vendor specific parameters """ base_url = self.get_operation_by_name( 'GetObservation').methods[method]['url'] request = { 'service': 'SOS', 'version': self.version, 'request': 'GetObservation' } # Required Fields assert isinstance(offerings, list) and len(offerings) > 0 request['offering'] = ','.join(offerings) assert isinstance(observedProperties, list) and len(observedProperties) > 0 request['observedproperty'] = ','.join(observedProperties) assert isinstance(responseFormat, str) request['responseFormat'] = responseFormat # Optional Fields if eventTime is not None: request['eventTime'] = eventTime if kwargs: for kw in kwargs: request[kw] = kwargs[kw] data = urlencode(request) response = openURL(base_url, data, method, username=self.username, password=self.password).read() try: tr = etree.fromstring(response) if tr.tag == nspath_eval("ows:ExceptionReport", namespaces): raise ows.ExceptionReport(tr) except ows.ExceptionReport: raise except BaseException: return response
def describe_sensor(self, outputFormat=None, procedure=None, method=None, **kwargs): method = method or 'Get' try: base_url = next((m.get('url') for m in self.getOperationByName('DescribeSensor').methods if m.get('type').lower() == method.lower())) except StopIteration: base_url = self.url request = {'service': 'SOS', 'version': self.version, 'request': 'DescribeSensor'} # Required Fields assert isinstance(outputFormat, str) request['procedureDescriptionFormat'] = outputFormat assert isinstance(procedure, str) request['procedure'] = procedure url_kwargs = {} if 'timeout' in kwargs: url_kwargs['timeout'] = kwargs.pop('timeout') # Client specified timeout value # Optional Fields if kwargs: for kw in kwargs: request[kw] = kwargs[kw] response = openURL(base_url, request, method, username=self.username, password=self.password, **url_kwargs).read() tr = etree.fromstring(response) if tr.tag == nspath_eval("ows:ExceptionReport", namespaces): raise ows.ExceptionReport(tr) return response
def describe_sensor(self, outputFormat=None, procedure=None, method='Get', raw=False, **kwargs): try: base_url = self.get_operation_by_name( 'DescribeSensor').methods[method]['url'] except: base_url = self.url request = { 'service': 'SOS', 'version': self.version, 'request': 'DescribeSensor' } # Required Fields assert isinstance(outputFormat, str) request['procedureDescriptionFormat'] = outputFormat assert isinstance(procedure, str) request['procedure'] = procedure # Optional Fields if kwargs: for kw in kwargs: request[kw] = kwargs[kw] data = urlencode(request) response = openURL(base_url, data, method, username=self.username, password=self.password).read() tr = etree.fromstring(response) if tr.tag == nspath_eval("ows:ExceptionReport", namespaces): raise ows.ExceptionReport(tr) if raw: return response else: return SosDescribeSensorResponse(tr, namespaces)
def describe_sensor(self, outputFormat=None, procedure=None, method='Get', **kwargs): try: base_url = next( (m.get('url') for m in self.getOperationByName('DescribeSensor').methods if m.get('type').lower() == method.lower())) except StopIteration: base_url = self.url request = { 'service': 'SOS', 'version': self.version, 'request': 'DescribeSensor' } # Required Fields assert isinstance(outputFormat, str) request['outputFormat'] = outputFormat assert isinstance(procedure, str) request['procedure'] = procedure # Optional Fields if kwargs: for kw in kwargs: request[kw] = kwargs[kw] data = urlencode(request) response = openURL(base_url, data, method, username=self.username, password=self.password).read() tr = etree.fromstring(response) if tr.tag == nspath_eval("ows:ExceptionReport", namespaces): raise ows.ExceptionReport(tr) return response
def _invoke(self): # do HTTP request request_url = self.url # Get correct URL based on Operation list. # If skip_caps=True, then self.operations has not been set, so use # default URL. if hasattr(self, 'operations'): caller = inspect.stack()[1][3] if caller == 'getrecords2': caller = 'getrecords' try: op = self.get_operation_by_name(caller) if isinstance(self.request, six.string_types): # GET KVP get_verbs = [ x for x in op.methods if x.get('type').lower() == 'get' ] request_url = get_verbs[0].get('url') else: post_verbs = [ x for x in op.methods if x.get('type').lower() == 'post' ] if len(post_verbs) > 1: # Filter by constraints. We must match a PostEncoding of "XML" for pv in post_verbs: for const in pv.get('constraints'): if const.name.lower() == 'postencoding': values = [v.lower() for v in const.values] if 'xml' in values: request_url = pv.get('url') break else: # Well, just use the first one. request_url = post_verbs[0].get('url') elif len(post_verbs) == 1: request_post_url = post_verbs[0].get('url') except: # no such luck, just go with request_url pass if isinstance(self.request, six.string_types): # GET KVP self.request = '%s%s' % (bind_url(request_url), self.request) self.response = openURL(self.request, None, 'Get', username=self.username, password=self.password, timeout=self.timeout).read() else: self.request = cleanup_namespaces(self.request) # Add any namespaces used in the "typeNames" attribute of the # csw:Query element to the query's xml namespaces. for query in self.request.findall( util.nspath_eval('csw:Query', namespaces)): ns = query.get("typeNames", None) if ns is not None: # Pull out "gmd" from something like "gmd:MD_Metadata" from the list # of typenames ns_keys = [x.split(':')[0] for x in ns.split(' ')] self.request = add_namespaces(self.request, ns_keys) self.request = util.element_to_string(self.request, encoding='utf-8') self.response = util.http_post(request_url, self.request, self.lang, self.timeout, self.username, self.password) # parse result see if it's XML self._exml = etree.parse(BytesIO(self.response)) # it's XML. Attempt to decipher whether the XML response is CSW-ish """ valid_xpaths = [ util.nspath_eval('ows:ExceptionReport', namespaces), util.nspath_eval('csw:Capabilities', namespaces), util.nspath_eval('csw:DescribeRecordResponse', namespaces), util.nspath_eval('csw:GetDomainResponse', namespaces), util.nspath_eval('csw:GetRecordsResponse', namespaces), util.nspath_eval('csw:GetRecordByIdResponse', namespaces), util.nspath_eval('csw:HarvestResponse', namespaces), util.nspath_eval('csw:TransactionResponse', namespaces) ] if self._exml.getroot().tag not in valid_xpaths: raise RuntimeError('Document is XML, but not CSW-ish') # check if it's an OGC Exception val = self._exml.find(util.nspath_eval('ows:Exception', namespaces)) if val is not None: raise ows.ExceptionReport(self._exml, self.owscommon.namespace) else: self.exceptionreport = None
def get_observation(self, responseFormat=None, offerings=None, observedProperties=None, eventTime=None, procedure=None, method=None, **kwargs): """ Parameters ---------- format : string Output format. Provide one that is available for all offerings method : string Optional. HTTP DCP method name: Get or Post. Must **kwargs : extra arguments anything else e.g. vendor specific parameters """ method = method or 'Get' # Pluck out the get observation URL for HTTP method - methods is an # array of dicts methods = self.get_operation_by_name('GetObservation').methods base_url = [m['url'] for m in methods if m['type'] == method][0] request = { 'service': 'SOS', 'version': self.version, 'request': 'GetObservation' } # Required Fields assert isinstance(offerings, list) and len(offerings) > 0 request['offering'] = ','.join(offerings) assert isinstance(observedProperties, list) and len(observedProperties) > 0 request['observedProperty'] = ','.join(observedProperties) if responseFormat is not None: request['responseFormat'] = responseFormat # Optional Fields if eventTime is not None: request['temporalFilter'] = eventTime url_kwargs = {} if 'timeout' in kwargs: url_kwargs['timeout'] = kwargs.pop( 'timeout') # Client specified timeout value if procedure is not None: request['procedure'] = procedure if kwargs: for kw in kwargs: request[kw] = kwargs[kw] response = openURL(base_url, request, method, username=self.username, password=self.password, **url_kwargs).read() try: tr = etree.fromstring(response) if tr.tag == nspath_eval("ows:ExceptionReport", namespaces): raise ows.ExceptionReport(tr) else: return response except ows.ExceptionReport: raise except BaseException: return response
def get_observation(self, responseFormat=None, offerings=None, observedProperties=None, eventTime=None, procedure=None, method='Get', **kwargs): """ Parameters ---------- format : string Output format. Provide one that is available for all offerings method : string Optional. HTTP DCP method name: Get or Post. Must **kwargs : extra arguments anything else e.g. vendor specific parameters """ try: base_url = next( (m.get('url') for m in self.getOperationByName('GetObservation').methods if m.get('type').lower() == method.lower())) except StopIteration: base_url = self.url request = { 'service': 'SOS', 'version': self.version, 'request': 'GetObservation' } # Required Fields assert isinstance(offerings, list) and len(offerings) > 0 request['offering'] = ','.join(offerings) assert isinstance(observedProperties, list) and len(observedProperties) > 0 request['observedProperty'] = ','.join(observedProperties) assert isinstance(responseFormat, str) request['responseFormat'] = responseFormat # Optional Fields if eventTime is not None: request['eventTime'] = eventTime url_kwargs = {} if 'timeout' in kwargs: url_kwargs['timeout'] = kwargs.pop( 'timeout') # Client specified timeout value if procedure is not None: request['procedure'] = procedure if kwargs: for kw in kwargs: request[kw] = kwargs[kw] data = urlencode(request) response = openURL(base_url, data, method, username=self.username, password=self.password, **url_kwargs).read() try: tr = etree.fromstring(response) if tr.tag == nspath_eval("ows:ExceptionReport", namespaces): raise ows.ExceptionReport(tr) else: return response except ows.ExceptionReport: raise except BaseException: return response
def _invoke(self): # do HTTP request if isinstance(self.request, basestring): # GET KVP req = Request(self.request) if self.username is not None and self.password is not None: base64string = base64.encodestring('%s:%s' % (self.username, self.password))[:-1] req.add_header('Authorization', 'Basic %s' % base64string) self.response = urlopen(req, timeout=self.timeout).read() else: xml_post_url = self.url # Get correct POST URL based on Operation list. # If skip_caps=True, then self.operations has not been set, so use # default URL. if hasattr(self, 'operations'): caller = inspect.stack()[1][3] if caller == 'getrecords2': caller = 'getrecords' try: op = self.get_operation_by_name(caller) post_verbs = filter(lambda x: x.get('type').lower() == 'post', op.methods) if len(post_verbs) > 1: # Filter by constraints. We must match a PostEncoding of "XML" try: xml_post_url = next(x for x in filter(list, ([pv.get('url') for const in pv.get('constraints') if const.name.lower() == "postencoding" and 'xml' in map(lambda x: x.lower(), const.values)] for pv in post_verbs)))[0] except StopIteration: # Well, just use the first one. xml_post_url = post_verbs[0].get('url') elif len(post_verbs) == 1: xml_post_url = post_verbs[0].get('url') except: # no such luck, just go with xml_post_url pass self.request = cleanup_namespaces(self.request) # Add any namespaces used in the "typeNames" attribute of the # csw:Query element to the query's xml namespaces. for query in self.request.findall(util.nspath_eval('csw:Query', namespaces)): ns = query.get("typeNames", None) if ns is not None: # Pull out "gmd" from something like "gmd:MD_Metadata" from the list # of typenames ns_keys = [x.split(':')[0] for x in ns.split(' ')] self.request = add_namespaces(self.request, ns_keys) self.request = util.element_to_string(self.request, encoding='utf-8') #Modified by Ross Thompson for use with FGP #self.response = util.http_post(xml_post_url, self.request, self.lang, self.timeout, self.username, self.password) self.response = util.http_post(self.url, self.request, self.lang, self.timeout, self.username, self.password) # parse result see if it's XML self._exml = etree.parse(StringIO.StringIO(self.response)) # it's XML. Attempt to decipher whether the XML response is CSW-ish """ valid_xpaths = [ util.nspath_eval('ows:ExceptionReport', namespaces), util.nspath_eval('csw:Capabilities', namespaces), util.nspath_eval('csw:DescribeRecordResponse', namespaces), util.nspath_eval('csw:GetDomainResponse', namespaces), util.nspath_eval('csw:GetRecordsResponse', namespaces), util.nspath_eval('csw:GetRecordByIdResponse', namespaces), util.nspath_eval('csw:HarvestResponse', namespaces), util.nspath_eval('csw:TransactionResponse', namespaces) ] if self._exml.getroot().tag not in valid_xpaths: raise RuntimeError('Document is XML, but not CSW-ish') # check if it's an OGC Exception val = self._exml.find(util.nspath_eval('ows:Exception', namespaces)) if val is not None: raise ows.ExceptionReport(self._exml, self.owscommon.namespace) else: self.exceptionreport = None
def _invoke(self, mock_requests_post, mock_requests_request): try: if self.auth.token is not None: self.auth.username = "******" self.auth.password = self.auth.token except AttributeError: pass # do HTTP request request_url = self.url # Get correct URL based on Operation list. # If skip_caps=True, then self.operations has not been set, so use # default URL. if hasattr(self, "operations"): caller = inspect.stack()[1][3] if caller == "getrecords2": caller = "getrecords" # noinspection PyBroadException try: op = self.get_operation_by_name(caller) if isinstance(self.request, str): # GET KVP get_verbs = [ x for x in op.methods if x.get("type").lower() == "get" ] request_url = get_verbs[0].get("url") else: post_verbs = [ x for x in op.methods if x.get("type").lower() == "post" ] if len(post_verbs) > 1: # Filter by constraints. We must match a PostEncoding of "XML" for pv in post_verbs: for const in pv.get("constraints"): if const.name.lower() == "postencoding": values = [v.lower() for v in const.values] if "xml" in values: request_url = pv.get("url") break else: # Well, just use the first one. request_url = post_verbs[0].get("url") elif len(post_verbs) == 1: request_url = post_verbs[0].get("url") except Exception: # nosec # no such luck, just go with request_url pass # print("Echo") if isinstance(self.request, str): # GET KVP # print("Foxtrot") self.request = "%s%s" % (bind_url(request_url), self.request) self.response = openURL(self.request, None, "Get", timeout=self.timeout, auth=self.auth).read() # debug # print("invoke") # print(self.response[0:100]) else: # print("Golf") self.request = cleanup_namespaces(self.request) # Add any namespaces used in the "typeNames" attribute of the # csw:Query element to the query's xml namespaces. # noinspection PyUnresolvedReferences for query in self.request.findall( util.nspath_eval("csw:Query", csw_namespaces)): ns = query.get("typeNames", None) if ns is not None: # Pull out "gmd" from something like "gmd:MD_Metadata" from the list # of typenames ns_keys = [x.split(":")[0] for x in ns.split(" ")] self.request = add_namespaces(self.request, ns_keys) self.request = add_namespaces(self.request, "ows") self.request = util.element_to_string(self.request, encoding="utf-8") # print("Hotel") self.response = http_post(request_url, self.request, self.lang, self.timeout, auth=self.auth) # debug # print("invoke 2") # print(self.response[0:100]) # debug # print("parse") # print(self.response[0:100]) # print(self.response) # parse result see if it's XML self._exml = etree.parse(BytesIO(self.response)) # it's XML. Attempt to decipher whether the XML response is CSW-ish """ valid_xpaths = [ util.nspath_eval("ows:ExceptionReport", csw_namespaces), util.nspath_eval("csw:Capabilities", csw_namespaces), util.nspath_eval("csw:DescribeRecordResponse", csw_namespaces), util.nspath_eval("csw:GetDomainResponse", csw_namespaces), util.nspath_eval("csw:GetRecordsResponse", csw_namespaces), util.nspath_eval("csw:GetRecordByIdResponse", csw_namespaces), util.nspath_eval("csw:HarvestResponse", csw_namespaces), util.nspath_eval("csw:TransactionResponse", csw_namespaces), ] if self._exml.getroot().tag not in valid_xpaths: raise RuntimeError("Document is XML, but not CSW-ish") # check if it's an OGC Exception val = self._exml.find(util.nspath_eval("ows:Exception", csw_namespaces)) if val is not None: raise ows.ExceptionReport(self._exml, self.owscommon.namespace) else: self.exceptionreport = None
def get_data_availability(self, procedures=None, observedProperties=None, featuresOfInterest=None, offerings=None, method=None, **kwargs): """Performs "GetDataAvailability" request Parameters ---------- procedures: non-empty list of str, optional request only specific procedures observedProperties: non-empty list of str, optional request only specific observed properties featuresOfInterest : non-empty list of str, optional request only specific features of interest offerings : non-empty list of str, optional request only specific offerings method: str, optional http method (default is "Get") Returns ------- list of GetDataAvailability members """ method = method or 'Get' try: base_url = next(( m.get('url') for m in self.getOperationByName('GetDataAvailability').methods if m.get('type').lower() == method.lower())) except StopIteration: base_url = self.url #Mandatory request parameters request = { 'service': 'SOS', 'version': "2.0.0", 'request': 'GetDataAvailability' } # Optional Fields if procedures is not None: check_list_param(procedures) procedure = ','.join(procedures) request['procedure'] = procedure if observedProperties is not None: check_list_param(observedProperties) observedProperty = ','.join(observedProperties) request['observedProperty'] = observedProperty if featuresOfInterest is not None: check_list_param(featuresOfInterest) featureOfInterest = ','.join(featuresOfInterest) request['featureOfInterest'] = featureOfInterest if offerings is not None: check_list_param(offerings) offering = ','.join(offerings) request['offering'] = offering url_kwargs = {} if 'timeout' in kwargs: url_kwargs['timeout'] = kwargs.pop( 'timeout') # Client specified timeout value if kwargs: for kw in kwargs: request[kw] = kwargs[kw] request_gda = openURL(base_url, request, method, username=self.username, password=self.password, **url_kwargs).read() gda = etree.fromstring(request_gda) if gda.tag == nspath_eval("ows:ExceptionReport", namespaces): raise ows.ExceptionReport(gda) gdaMembers = gda.findall( nspath_eval("gda:dataAvailabilityMember", namespaces)) final = list(map(gda_member, gdaMembers)) return (final)
def get_observation(self, responseFormat=None, offerings=None, observedProperties=None, featuresOfInterest=None, procedures=None, eventTime=None, method=None, **kwargs): """Overrides parent function get_observation() Performs "GetObservation" request Parameters ---------- responseFormat : str response format, e.g. 'http://www.opengis.net/om/2.0' offerings : non-empty list of str, optional request only specific offerings observedProperties: non-empty list of str, optional request only specific observed properties featuresOfInterest : non-empty list of str, optional request only specific features of interest procedures: non-empty list of str, optional request only specific procedures eventTime: str, optional event time as om:resultTime, e.g. 'om:resultTime,2019-01-01T12:00:00Z/2019-01-02T12:00:00Z' method: str, optional http method (default is "Get") **kwargs : extra arguments anything else e.g. vendor specific parameters It is recommended to provide at least one of featuresOfInterest, observedProperties, offerings or procedures. Otherwise the request may take very long. Returns ------- response of the request as <class 'bytes'> """ method = method or 'Get' # Pluck out the get observation URL for HTTP method - methods is an # array of dicts methods = self.get_operation_by_name('GetObservation').methods base_url = [m['url'] for m in methods if m['type'] == method][0] request = { 'service': 'SOS', 'version': self.version, 'request': 'GetObservation' } if responseFormat is not None: request['responseFormat'] = responseFormat if offerings is not None: check_list_param(offerings) offering = ','.join(offerings) request['offering'] = offering if observedProperties is not None: check_list_param(observedProperties) observedProperty = ','.join(observedProperties) request['observedProperty'] = observedProperty if featuresOfInterest is not None: check_list_param(featuresOfInterest) featureOfInterest = ','.join(featuresOfInterest) request['featureOfInterest'] = featureOfInterest if procedures is not None: check_list_param(procedures) procedure = ','.join(procedures) request['procedure'] = procedure if eventTime is not None: request['temporalFilter'] = eventTime url_kwargs = {} if 'timeout' in kwargs: url_kwargs['timeout'] = kwargs.pop( 'timeout') # Client specified timeout value if kwargs: for kw in kwargs: request[kw] = kwargs[kw] response = openURL(base_url, request, method, username=self.username, password=self.password, **url_kwargs).read() try: tr = etree.fromstring(response) if tr.tag == nspath_eval("ows:ExceptionReport", namespaces): raise ows.ExceptionReport(tr) else: return response except ows.ExceptionReport: raise except BaseException: return response
def get_feature_of_interest(self, featuresOfInterest=None, observedProperties=None, procedures=None, responseFormat=None, method=None, **kwargs): """Performs "GetFeatureOfInterest" request Parameters ---------- featuresOfInterest : non-empty list of str, optional request only specific features of interest observedProperties: non-empty list of str, optional request only specific observed properties procedures: non-empty list of str, optional request only specific procedures responseFormat : str, optional response format method: str, optional http method (default is "Get") Returns ------- response of the request as <class 'bytes'> """ method = method or 'Get' methods = self.get_operation_by_name('GetFeatureOfInterest').methods base_url = [m['url'] for m in methods if m['type'] == method][0] request = { 'service': 'SOS', 'version': self.version, 'request': 'GetFeatureOfInterest' } # Optional Fields if featuresOfInterest is not None: check_list_param(featuresOfInterest) featureOfInterest = ','.join(featuresOfInterest) request['featureOfInterest'] = featureOfInterest if observedProperties is not None: check_list_param(observedProperties) observedProperty = ','.join(observedProperties) request['observedProperty'] = observedProperty if procedures is not None: check_list_param(procedures) procedure = ','.join(procedures) request['procedure'] = procedure if responseFormat is not None: request['responseFormat'] = responseFormat url_kwargs = {} if 'timeout' in kwargs: url_kwargs['timeout'] = kwargs.pop( 'timeout') # Client specified timeout value if kwargs: for kw in kwargs: request[kw] = kwargs[kw] response = openURL(base_url, request, method, username=self.username, password=self.password, **url_kwargs).read() try: tr = etree.fromstring(response) if tr.tag == nspath_eval("ows:ExceptionReport", namespaces): raise ows.ExceptionReport(tr) else: return response except ows.ExceptionReport: raise except BaseException: return response