def PUT(self, data): assert self.uri, "GET has to be called before PUT possible" self.PUT_headers.update({ "Content-Type": self.content_type, "Content-Length": str(len(data)), }) opener = urllib2.build_opener(urllib2.HTTPHandler) request = urllib2.Request(self.uri, data=data, headers=self.PUT_headers) request.get_method = lambda: 'PUT' response = opener.open(request) return response
def GET( self, uri, extra_headers=None, httphandler=None, ): """Lookup URI and follow redirects. Return data""" if not hasattr(self, "uri"): self.uri = uri else: if not self.uri == uri: raise Exception("You cannot pass different uris to the same " "backend") if httphandler: if isinstance(httphandler, list): opener = urllib2.build_opener(*httphandler) else: opener = urllib2.build_opener(httphandler) else: opener = urllib2.build_opener() if extra_headers: self.GET_headers.update(extra_headers) reference_time = datetime.datetime.now() request = urllib2.Request(url=uri, headers=self.GET_headers) try: resultF = opener.open(request) except (UnicodeEncodeError, socket.timeout): return None now = datetime.datetime.now() self.lookup_time = now - reference_time if resultF.geturl() != uri: logger.info( "%s was redirected. Content url: %r" % ( uri, resultF.geturl())) if "Content-Length" in resultF.headers: logger.info( "Content-Length: %s" % resultF.headers["Content-Length"]) if "Content-Type" not in resultF.headers: raise FiletypeMappingError("No Content-Type specified in response") self.content_type = resultF.headers['Content-Type'].split(";")[0] # Many servers don't do content negotiation: if one of the following # content_types are returned by server, assume the mapped type overwrite_content_type_map = { "text/plain": "application/rdf+xml", } if self.content_type in overwrite_content_type_map: self.content_type = overwrite_content_type_map[self.content_type] try: file_extension = mimetypes.guess_extension(self.content_type) assert file_extension except AssertionError: logger.error( "{} not supported by ldtools".format( resultF.headers['Content-Type'])) raise FiletypeMappingError( "No mimetype found for %s" % self.content_type) format = file_extension.strip(".") # assure format is correct if format in ["rdf", "ksh"]: format = "xml" # check if rdflib parser exists for format assure_parser_plugin_exists(format) self.format = format return resultF.read()