summaryrefslogtreecommitdiffstats
path: root/silpa/jsonrpc/modpywrapper.py
diff options
context:
space:
mode:
Diffstat (limited to 'silpa/jsonrpc/modpywrapper.py')
-rw-r--r--silpa/jsonrpc/modpywrapper.py52
1 files changed, 52 insertions, 0 deletions
diff --git a/silpa/jsonrpc/modpywrapper.py b/silpa/jsonrpc/modpywrapper.py
new file mode 100644
index 0000000..3e61017
--- /dev/null
+++ b/silpa/jsonrpc/modpywrapper.py
@@ -0,0 +1,52 @@
+import sys, os
+from jsonrpc import ServiceHandler, ServiceException
+
+
+class ServiceImplementaionNotFound(ServiceException):
+ pass
+
+
+class ModPyServiceHandler(ServiceHandler):
+ def __init__(self, req):
+ self.req = req
+ ServiceHandler.__init__(self, None)
+
+
+ def findServiceEndpoint(self, name):
+ req = self.req
+
+ (modulePath, fileName) = os.path.split(req.filename)
+ (moduleName, ext) = os.path.splitext(fileName)
+
+ if not os.path.exists(os.path.join(modulePath, moduleName + ".py")):
+ raise ServiceImplementaionNotFound()
+ else:
+ if not modulePath in sys.path:
+ sys.path.insert(0, modulePath)
+
+ from mod_python import apache
+ module = apache.import_module(moduleName, log=1)
+
+ if hasattr(module, "service"):
+ self.service = module.service
+ elif hasattr(module, "Service"):
+ self.service = module.Service()
+ else:
+ self.service = module
+
+ return ServiceHandler.findServiceEndpoint(self, name)
+
+
+ def handleRequest(self, data):
+ self.req.content_type = "text/plain"
+ data = self.req.read()
+ resultData = ServiceHandler.handleRequest(self, data)
+ self.req.write(resultData)
+ self.req.flush()
+
+def handler(req):
+ from mod_python import apache
+ ModPyServiceHandler(req).handleRequest(req)
+ return apache.OK
+
+