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)
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()
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
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()
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
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 ]
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")
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
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)
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)
# 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