def buildHeader(header_node, namespaces): e = etree.XPathEvaluator(header_node, namespaces=namespaces).evaluate identifier = e('string(oai:identifier/text())') datestamp = datestamp_to_datetime( str(e('string(oai:datestamp/text())'))) setspec = [str(s) for s in e('oai:setSpec/text()')] deleted = e("@status = 'deleted'") return common.Header(identifier, datestamp, setspec, deleted)
def handleRequest(self, request_kw): """Handles incoming OAI-PMH request. request_kw is a dictionary containing request parameters, including verb. """ # try to get verb, if not, we have an argument handling error try: new_kw = {} try: for key, value in request_kw.items(): new_kw[str(key)] = value except UnicodeError: raise error.BadVerbError,\ "Non-ascii keys in request." request_kw = new_kw try: verb = request_kw.pop('verb') except KeyError: verb = 'unknown' raise error.BadVerbError,\ "Required verb argument not found." if verb not in ['GetRecord', 'Identify', 'ListIdentifiers', 'ListMetadataFormats', 'ListRecords', 'ListSets']: raise error.BadVerbError, "Illegal verb: %s" % verb # replace from and until arguments if necessary from_ = request_kw.get('from') if from_ is not None: # rename to from_ for internal use request_kw['from_'] = datestamp_to_datetime(from_) del request_kw['from'] until = request_kw.get('until') if until is not None: request_kw['until'] = datestamp_to_datetime(until) # now validate parameters try: validation.validateResumptionArguments(verb, request_kw) except validation.BadArgumentError, e: # have to raise this as a error.BadArgumentError raise error.BadArgumentError, str(e) # now handle verb return self.handleVerb(verb, request_kw)
def decodeResumptionToken(token): token = str(token) try: kw = cgi.parse_qs(token, True, True) except ValueError: raise error.BadResumptionTokenError,\ "Unable to decode resumption token: %s" % token result = {} for key, value in kw.items(): value = value[0] if key == 'from_' or key == 'until': value = datestamp_to_datetime(value) result[key] = value try: cursor = int(result.pop('cursor')) except (KeyError, ValueError): raise error.BadResumptionTokenError,\ "Unable to decode resumption token (bad cursor): %s" % token # XXX should also validate result contents. Need verb information # for this, and somewhat more flexible verb validation support return result, cursor
def Identify_impl(self, args, tree): namespaces = self.getNamespaces() evaluator = etree.XPathEvaluator(tree, namespaces=namespaces) identify_node = evaluator.evaluate( '/oai:OAI-PMH/oai:Identify')[0] identify_evaluator = etree.XPathEvaluator(identify_node, namespaces=namespaces) e = identify_evaluator.evaluate repositoryName = e('string(oai:repositoryName/text())') baseURL = e('string(oai:baseURL/text())') protocolVersion = e('string(oai:protocolVersion/text())') adminEmails = e('oai:adminEmail/text()') earliestDatestamp = datestamp_to_datetime( e('string(oai:earliestDatestamp/text())')) deletedRecord = e('string(oai:deletedRecord/text())') granularity = e('string(oai:granularity/text())') compression = e('oai:compression/text()') # XXX description identify = common.Identify( repositoryName, baseURL, protocolVersion, adminEmails, earliestDatestamp, deletedRecord, granularity, compression) return identify