source file: /Library/Python/2.3/site-packages/CherryPy-3.0.1-py2.3.egg/cherrypy/lib/xmlrpc.py
file stats: 25 lines, 8 executed: 32.0% covered
   1. import sys
   2. import xmlrpclib
   3. 
   4. import cherrypy
   5. 
   6. 
   7. def process_body():
   8.     """Return (params, method) from request body."""
   9.     try:
  10.         return xmlrpclib.loads(cherrypy.request.body.read())
  11.     except Exception:
  12.         return ('ERROR PARAMS', ), 'ERRORMETHOD'
  13. 
  14. 
  15. def patched_path(path):
  16.     """Return 'path', doctored for RPC."""
  17.     if not path.endswith('/'):
  18.         path += '/'
  19.     if path.startswith('/RPC2/'):
  20.         # strip the first /rpc2
  21.         path = path[5:]
  22.     return path
  23. 
  24. 
  25. def _set_response(body):
  26.     # The XML-RPC spec (http://www.xmlrpc.com/spec) says:
  27.     # "Unless there's a lower-level error, always return 200 OK."
  28.     # Since Python's xmlrpclib interprets a non-200 response
  29.     # as a "Protocol Error", we'll just return 200 every time.
  30.     response = cherrypy.response
  31.     response.status = '200 OK'
  32.     response.body = body
  33.     response.headers['Content-Type'] = 'text/xml'
  34.     response.headers['Content-Length'] = len(body)
  35. 
  36. 
  37. def respond(body, encoding='utf-8', allow_none=0):
  38.     _set_response(xmlrpclib.dumps((body,), methodresponse=1,
  39.                                   encoding=encoding,
  40.                                   allow_none=allow_none))
  41. 
  42. def on_error():
  43.     body = str(sys.exc_info()[1])
  44.     _set_response(xmlrpclib.dumps(xmlrpclib.Fault(1, body)))
  45.