Ejemplo n.º 1
0
    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
Ejemplo n.º 2
0
    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()