Index: third_party/cherrypy/lib/xmlrpcutil.py |
=================================================================== |
--- third_party/cherrypy/lib/xmlrpcutil.py (revision 0) |
+++ third_party/cherrypy/lib/xmlrpcutil.py (revision 0) |
@@ -0,0 +1,55 @@ |
+import sys |
+ |
+import cherrypy |
+from cherrypy._cpcompat import ntob |
+ |
+def get_xmlrpclib(): |
+ try: |
+ import xmlrpc.client as x |
+ except ImportError: |
+ import xmlrpclib as x |
+ return x |
+ |
+def process_body(): |
+ """Return (params, method) from request body.""" |
+ try: |
+ return get_xmlrpclib().loads(cherrypy.request.body.read()) |
+ except Exception: |
+ return ('ERROR PARAMS', ), 'ERRORMETHOD' |
+ |
+ |
+def patched_path(path): |
+ """Return 'path', doctored for RPC.""" |
+ if not path.endswith('/'): |
+ path += '/' |
+ if path.startswith('/RPC2/'): |
+ # strip the first /rpc2 |
+ path = path[5:] |
+ return path |
+ |
+ |
+def _set_response(body): |
+ # The XML-RPC spec (http://www.xmlrpc.com/spec) says: |
+ # "Unless there's a lower-level error, always return 200 OK." |
+ # Since Python's xmlrpclib interprets a non-200 response |
+ # as a "Protocol Error", we'll just return 200 every time. |
+ response = cherrypy.response |
+ response.status = '200 OK' |
+ response.body = ntob(body, 'utf-8') |
+ response.headers['Content-Type'] = 'text/xml' |
+ response.headers['Content-Length'] = len(body) |
+ |
+ |
+def respond(body, encoding='utf-8', allow_none=0): |
+ xmlrpclib = get_xmlrpclib() |
+ if not isinstance(body, xmlrpclib.Fault): |
+ body = (body,) |
+ _set_response(xmlrpclib.dumps(body, methodresponse=1, |
+ encoding=encoding, |
+ allow_none=allow_none)) |
+ |
+def on_error(*args, **kwargs): |
+ body = str(sys.exc_info()[1]) |
+ xmlrpclib = get_xmlrpclib() |
+ _set_response(xmlrpclib.dumps(xmlrpclib.Fault(1, body))) |
+ |
Property changes on: third_party/cherrypy/lib/xmlrpcutil.py |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |