Merge commit 'local_master/master'
authorroot <root@blitz.inria.fr>
Thu, 2 Sep 2010 14:23:02 +0000 (16:23 +0200)
committerroot <root@blitz.inria.fr>
Thu, 2 Sep 2010 14:23:02 +0000 (16:23 +0200)
ModPythonJson.py [new file with mode: 0644]
PLC/API.py
PLCAPI.spec

diff --git a/ModPythonJson.py b/ModPythonJson.py
new file mode 100644 (file)
index 0000000..37cbc6b
--- /dev/null
@@ -0,0 +1,63 @@
+#
+# Apache mod_python interface for JSON requests
+#
+# Aaron Klingaman <alk@absarokasoft.com>
+# Mark Huang <mlhuang@cs.princeton.edu>
+#
+# Copyright (C) 2004-2006 The Trustees of Princeton University
+# $Id$
+# $URL$
+#
+
+import sys
+import traceback
+import xmlrpclib
+from mod_python import apache
+
+from PLC.Debug import log
+
+from PLC.API import PLCAPI
+api = PLCAPI()
+
+def handler(req):
+    try:
+        if req.method != "POST":
+            req.content_type = "text/html"
+            req.send_http_header()
+            req.write("""
+<html><head>
+<title>PLCAPI JSON Interface</title>
+</head><body>
+<h1>PLCAPI JSON Interface</h1>
+<p>Please POST JSON to access the PLCAPI.</p>
+</body></html>
+""")
+            return apache.OK
+
+        # Read request
+        request = req.read(int(req.headers_in['content-length']))
+
+        # mod_python < 3.2: The IP address portion of remote_addr is
+        # incorrect (always 0.0.0.0) when IPv6 is enabled.
+        # http://issues.apache.org/jira/browse/MODPYTHON-64?page=all
+        (remote_ip, remote_port) = req.connection.remote_addr
+        remote_addr = (req.connection.remote_ip, remote_port)
+
+        # Handle request
+        response = api.handle_json(remote_addr, request)
+
+        # Shut down database connection, otherwise up to MaxClients DB
+        # connections will remain open.
+        api.db.close()
+
+        # Write response
+        req.content_type = "text/json; charset=" + api.encoding
+        req.send_http_header()
+        req.write(response)
+
+        return apache.OK
+
+    except Exception, err:
+        # Log error in /var/log/httpd/(ssl_)?error_log
+        print >> log, err, traceback.format_exc()
+        return apache.HTTP_INTERNAL_SERVER_ERROR
index 783280f..0d228f7 100644 (file)
@@ -14,6 +14,18 @@ import traceback
 import string
 
 import xmlrpclib
+import simplejson
+try:
+    # Try to use jsonlib before using simpljson. This is a hack to get around
+    # the fact that the version of simplejson avaialble for f8 is slightly 
+    # faster than xmlrpc but not as fast as jsonlib. There is no jsonlib 
+    # pacakge available for f8, so this has to be installed manually and
+    # is not expected to always be available. Remove this once we move away
+    # from f8 based MyPLC's         
+    import jsonlib
+    json = jsonlib
+except:
+    json = simplejson 
 
 # See "2.2 Characters" in the XML specification:
 #
@@ -207,3 +219,17 @@ class PLCAPI:
             data = buildSOAP(kw = {'%sResponse' % method: {'Result': result}}, encoding = self.encoding)
 
         return data
+
+    def handle_json(self, source, data):
+        """
+        Handle a JSON request 
+        """
+        method, args = json.loads(data)
+        try:
+            result = self.call(source, method, *args)
+        except Exception, e:
+            result = str(e)
+       
+        return json.dumps(result) 
+        
+        
index 4442ad6..5ff7915 100644 (file)
@@ -38,6 +38,7 @@ Requires: mod_python
 Requires: mod_wsgi
 Requires: mod_ssl
 Requires: SOAPpy
+Requires: python-simplejson
 # for the RebootNodeWithPCU method
 Requires: pcucontrol >= 1.0-6
 # for OMF integration