Exemple #1
0
    def open_file(self, nodeid, filename, mode="r", codec=None):
        """Open a file contained within a node"""

        # read: GET nodeid/file
        # write: POST nodeid/file
        # append: POST nodeid/file?mode=a

        class HttpFile(object):
            def __init__(self, codec=None):
                self.data = []
                self.codec = codec

            def write(self, data):
                if codec:
                    data = data.encode(codec)
                self.data.append(data)

        if mode == "r":
            self._request('GET',
                          format_node_path(self._prefix, nodeid, filename))
            result = self._conn.getresponse()
            if result.status == httplib.OK:
                return result
            else:
                raise connlib.FileError()

        elif mode == "w":
            stream = HttpFile(codec)

            def on_close():
                body_content = "".join(stream.data)
                self._request('POST',
                              format_node_path(self._prefix, nodeid, filename),
                              body_content)
                result = self._conn.getresponse()

            stream.close = on_close
            return stream

        elif mode == "a":
            stream = HttpFile(codec)

            def on_close():
                body_content = "".join(stream.data)
                self._request(
                    'POST',
                    format_node_path(self._prefix, nodeid, filename) +
                    "?mode=a", body_content)
                result = self._conn.getresponse()

            stream.close = on_close
            return stream

        else:
            raise connlib.FileError("unknown mode '%s'" % mode)
Exemple #2
0
    def create_dir(self, nodeid, filename):

        # Directories must end with "/"
        if not filename.endswith("/"):
            raise connlib.FileError()

        # PUT nodeid/dir/
        self._request(
            'PUT', format_node_path(self._prefix, nodeid, filename))
        result = self._conn.getresponse()
        if result.status != httplib.OK:
            raise connlib.FileError()
Exemple #3
0
 def create_dir(self, nodeid, filename):
     """Create directory within node"""
     node = self._nodes.get(nodeid)
     if node is None:
         raise connlib.UnknownNode()
     if not filename.endswith("/"):
         raise connlib.FileError()
     node.files[filename] = None
Exemple #4
0
    def delete_file(self, nodeid, filename):
        """Open a file contained within a node"""

        # DELETE nodeid/file
        self._request(
            'DELETE', format_node_path(self._prefix, nodeid, filename))
        result = self._conn.getresponse()
        if result.status != httplib.OK:
            raise connlib.FileError()
Exemple #5
0
    def create_dir(self, nodeid, filename):
        """Create directory within node"""
        node = self._nodes.get(nodeid)
        if node is None:
            raise connlib.UnknownNode()
        if not filename.endswith("/"):
            raise connlib.FileError()

        # Create all directory parts.
        parts = filename.split("/")
        for i in range(len(parts) - 1):
            node.files["/".join(parts[:i + 1]) + "/"] = None
Exemple #6
0
 def list_dir(self, nodeid, filename="/"):
     """
     List data files in node
     """
     node = self._nodes.get(nodeid)
     if node is None:
         raise connlib.UnknownNode()
     if not filename.endswith("/"):
         raise connlib.FileError()
     files = [
         f for f in node.files.iterkeys()
         if f.startswith(filename) and f != filename
     ]
Exemple #7
0
    def list_dir(self, nodeid, filename="/"):
        """
        List data files in node
        """

        # GET nodeid/dir/
        if not filename.endswith("/"):
            filename += "/"
        self._request('GET', format_node_path(self._prefix, nodeid, filename))
        result = self._conn.getresponse()
        if result.status == httplib.OK:
            try:
                return plist.load(result)
            except Exception as e:
                raise connlib.ConnectionError(
                    "unexpected response '%s'" % str(e), e)
        else:
            raise connlib.FileError("cannot list node")
Exemple #8
0
    def open_file(self, nodeid, filename, mode="r", codec=None):
        """
        Open a file contained within a node

        nodeid   -- node to open a file from
        filename -- filename of file to open
        mode     -- can be "r" (read), "w" (write), "a" (append)
        codec    -- read or write with an encoding (default: None)
        """
        node = self._nodes.get(nodeid)
        if node is None:
            raise connlib.UnknownNode()
        if filename.endswith("/"):
            raise connlib.FileError()
        stream = node.files.get(filename)
        if stream is None:
            stream = node.files[filename] = File()
        else:
            stream.reopen()
        return stream
Exemple #9
0
    def list_dir(self, nodeid, filename="/"):
        """
        List data files in node
        """
        # Cannot list files.
        if not filename.endswith("/"):
            raise connlib.FileError()

        # GET nodeid/dir/
        self._request(
            'GET', format_node_path(self._prefix, nodeid, filename))
        result = self._conn.getresponse()
        if result.status == httplib.OK:
            try:
                if self._version == 1:
                    return self.load_data(result)
                else:
                    data = self.load_data(result)
                    return data['files']
            except Exception, e:
                raise connlib.ConnectionError(
                    "unexpected response '%s'" % str(e), e)
Exemple #10
0
    def list_dir(self, nodeid, filename="/"):
        """
        List data files in node
        """
        node = self._nodes.get(nodeid)
        if node is None:
            raise connlib.UnknownNode()
        if not filename.endswith("/"):
            raise connlib.FileError()

        seen = set()
        for name in node.files.iterkeys():
            if name.startswith(filename) and name != filename:
                part = name[len(filename):]
                index = part.find('/')
                if index >= 0:
                    # Do not list files within directory.
                    part = part[:index + 1]
                fullname = filename + part
                if fullname not in seen:
                    yield fullname
                    seen.add(fullname)
Exemple #11
0
        # GET nodeid/dir/
        self._request(
            'GET', format_node_path(self._prefix, nodeid, filename))
        result = self._conn.getresponse()
        if result.status == httplib.OK:
            try:
                if self._version == 1:
                    return self.load_data(result)
                else:
                    data = self.load_data(result)
                    return data['files']
            except Exception, e:
                raise connlib.ConnectionError(
                    "unexpected response '%s'" % str(e), e)
        else:
            raise connlib.FileError("cannot list node")

    def has_file(self, nodeid, filename):

        # HEAD nodeid/filename
        self._request(
            'HEAD', format_node_path(self._prefix, nodeid, filename))
        result = self._conn.getresponse()
        return result.status == httplib.OK

    #---------------------------------
    # indexing/querying

    def index_raw(self, query):
        # POST /?index
        # query plist encoded