def update_node(self, nodeid, attr): body_content = plist.dumps(attr).encode("utf8") self._request('POST', format_node_path(self._prefix, nodeid), body_content) result = self._conn.getresponse() if result.status != httplib.OK: raise connlib.ConnectionError() self._title_cache.update_attr(attr)
def index_raw(self, query): # POST /?index # query plist encoded body_content = plist.dumps(query).encode("utf8") self._request( 'POST', format_node_path(self._prefix) + "?index", body_content) result = self._conn.getresponse() if result.status == httplib.OK: try: return plist.load(result) except Exception, e: raise connlib.ConnectionError( "unexpected response '%s'" % str(e), e)
def index_raw(self, query): # POST /?index # query plist encoded body_content = plist.dumps(query).encode("utf8") self._request('POST', format_node_path(self._prefix) + "?index", body_content) 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)
def do_POST(self): parts, nodeid, filename = self.parse_path() content_len = int(self.headers.get("Content-length", 0)) data = self.rfile.read(content_len) try: if nodeid == "": # pure command if parts.query == "save": self.server.conn.save() elif parts.query == "index": query = plist.loads(data) res = self.server.conn.index(query) if hasattr(res, "next"): res = list(res) self.send_response(httplib.OK) self.send_header("content_type", "text/xml") self.end_headers() self.wfile.write(XML_HEADER) self.wfile.write(plist.dumps(res).encode("utf8")) return elif not filename: # update node attr = plist.loads(data) attr["nodeid"] = nodeid self.server.conn.update_node(nodeid, attr) else: # write file params = urlparse.parse_qs(parts.query) if params.get("mode", "r") == ["a"]: stream = self.server.conn.open_file(nodeid, filename, "a") else: stream = self.server.conn.open_file(nodeid, filename, "w") stream.write(data) stream.close() self.send_response(httplib.OK) self.send_header("content_type", "text/plain") self.end_headers() except Exception, e: # FIX response keepnote.log_error() self.send_error(httplib.NOT_FOUND, "cannot create node: " + str(e))
def do_POST(self): parts, nodeid, filename = self.parse_path() content_len = int(self.headers.get("Content-length", 0)) data = self.rfile.read(content_len) try: if nodeid == "": # pure command if parts.query == "save": self.server.conn.save() elif parts.query == "index": query = plist.loads(data) res = self.server.conn.index(query) if hasattr(res, "next"): res = list(res) self.send_response(httplib.OK) self.send_header("content_type", "text/xml") self.end_headers() self.wfile.write(XML_HEADER) self.wfile.write(plist.dumps(res).encode("utf8")) return elif not filename: # update node attr = plist.loads(data) attr["nodeid"] = nodeid self.server.conn.update_node(nodeid, attr) else: # write file params = urlparse.parse_qs(parts.query) if params.get("mode", "r") == ["a"]: stream = self.server.conn.open_file(nodeid, filename, "a") else: stream = self.server.conn.open_file(nodeid, filename, "w") stream.write(data) stream.close() self.send_response(httplib.OK) self.send_header("content_type", "text/plain") self.end_headers() except Exception as e: # FIX response keepnote.log_error() self.send_error(httplib.NOT_FOUND, "cannot create node: " + str(e))
def test_read_write_string(self): data = { "version": [1, 0, 3], "kind": "nice", "measure": 3.03, "use_feature": True } plist_xml = """\ <dict> <key>kind</key><string>nice</string> <key>version</key><array> <integer>1</integer> <integer>0</integer> <integer>3</integer> </array> <key>use_feature</key><true/> <key>measure</key><real>3.030000</real> </dict> """ elm = plist.loads(plist_xml) self.assertEqual(elm, data) text = plist.dumps(data, indent=4) self.assertEqual(text, plist_xml)
def do_GET(self): """ GET action handler """ parts, nodeid, filename = self.parse_path() try: if nodeid == "": if parts.query == "all": self.send_response(httplib.OK) self.send_header("content_type", "text/html") self.end_headers() self.wfile.write("<html><body>") write_tree(self.wfile, self.server.conn) self.wfile.write("</body></html>") return # get rootid rootid = self.server.conn.get_rootid() self.send_response(httplib.OK) self.send_header("content_type", "text/xml") self.end_headers() self.wfile.write(XML_HEADER) self.wfile.write(plist.dumps(rootid)) elif filename is None: # return node attr attr = self.server.conn.read_node(nodeid) self.send_response(httplib.OK) self.send_header("content_type", "text/xml") self.end_headers() if attr.get("parentids") == [None]: del attr["parentids"] self.wfile.write(XML_HEADER) self.wfile.write(plist.dumps(attr).encode("utf8")) elif filename.endswith("/"): # list directory files = list(self.server.conn.list_dir(nodeid, filename)) self.send_response(httplib.OK) self.send_header("content_type", "application/octet-stream") self.end_headers() self.wfile.write(XML_HEADER) self.wfile.write(plist.dumps(files).encode("utf8")) else: # return node file stream = self.server.conn.open_file(nodeid, filename) self.send_response(httplib.OK) self.send_header("content_type", "application/octet-stream") self.end_headers() self.wfile.write(stream.read()) stream.close() except Exception, e: self.send_error(404, "node not found " + str(e))
def dumps_data(self, data): if self._version == 2: return json.dumps(data) else: return plist.dumps(data)
def do_GET(self): """ GET action handler """ parts, nodeid, filename = self.parse_path() try: if nodeid == "": if parts.query == "all": self.send_response(httplib.OK) self.send_header("content_type", "text/html") self.end_headers() self.wfile.write("<html><body>") write_tree(self.wfile, self.server.conn) self.wfile.write("</body></html>") return # get rootid rootid = self.server.conn.get_rootid() self.send_response(httplib.OK) self.send_header("content_type", "text/xml") self.end_headers() self.wfile.write(XML_HEADER) self.wfile.write(plist.dumps(rootid)) elif filename is None: # return node attr attr = self.server.conn.read_node(nodeid) self.send_response(httplib.OK) self.send_header("content_type", "text/xml") self.end_headers() if attr.get("parentids") == [None]: del attr["parentids"] self.wfile.write(XML_HEADER) self.wfile.write(plist.dumps(attr).encode("utf8")) elif filename.endswith("/"): # list directory files = list(self.server.conn.list_dir(nodeid, filename)) self.send_response(httplib.OK) self.send_header("content_type", "application/octet-stream") self.end_headers() self.wfile.write(XML_HEADER) self.wfile.write(plist.dumps(files).encode("utf8")) else: # return node file stream = self.server.conn.open_file(nodeid, filename) self.send_response(httplib.OK) self.send_header("content_type", "application/octet-stream") self.end_headers() self.wfile.write(stream.read()) stream.close() except Exception as e: keepnote.log_error() self.send_error(404, "node not found " + str(e))