예제 #1
0
    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)
예제 #2
0
 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)
예제 #3
0
    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)
예제 #4
0
    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)
예제 #5
0
파일: http.py 프로젝트: brotchie/keepnote
    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))
예제 #6
0
    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))
예제 #7
0
    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)
예제 #8
0
    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))
예제 #9
0
 def dumps_data(self, data):
     if self._version == 2:
         return json.dumps(data)
     else:
         return plist.dumps(data)
예제 #10
0
    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))