source file: /Library/Python/2.3/site-packages/CherryPy-3.0.1-py2.3.egg/cherrypy/lib/wsgiapp.py
file stats: 49 lines, 6 executed: 12.2% covered
1. """A CherryPy tool for hosting a foreign WSGI application.""" 2. 3. import sys 4. 5. import cherrypy 6. 7. 8. # is this sufficient for start_response? 9. def start_response(status, response_headers, exc_info=None): 10. cherrypy.response.status = status 11. headers_dict = dict(response_headers) 12. cherrypy.response.headers.update(headers_dict) 13. 14. def make_environ(): 15. """grabbed some of below from wsgiserver.py 16. 17. for hosting WSGI apps in non-WSGI environments (yikes!) 18. """ 19. 20. request = cherrypy.request 21. 22. # create and populate the wsgi environ 23. environ = dict() 24. environ["wsgi.version"] = (1,0) 25. environ["wsgi.url_scheme"] = request.scheme 26. environ["wsgi.input"] = request.rfile 27. environ["wsgi.errors"] = sys.stderr 28. environ["wsgi.multithread"] = True 29. environ["wsgi.multiprocess"] = False 30. environ["wsgi.run_once"] = False 31. environ["REQUEST_METHOD"] = request.method 32. environ["SCRIPT_NAME"] = request.script_name 33. environ["PATH_INFO"] = request.path_info 34. environ["QUERY_STRING"] = request.query_string 35. environ["SERVER_PROTOCOL"] = request.protocol 36. environ["SERVER_NAME"] = request.local.name 37. environ["SERVER_PORT"] = request.local.port 38. environ["REMOTE_HOST"] = request.remote.name 39. environ["REMOTE_ADDR"] = request.remote.ip 40. environ["REMOTE_PORT"] = request.remote.port 41. # then all the http headers 42. headers = request.headers 43. environ["CONTENT_TYPE"] = headers.get("Content-type", "") 44. environ["CONTENT_LENGTH"] = headers.get("Content-length", "") 45. for (k, v) in headers.iteritems(): 46. envname = "HTTP_" + k.upper().replace("-","_") 47. environ[envname] = v 48. return environ 49. 50. 51. def run(app, env=None): 52. """Run the given WSGI app and set response.body to its output.""" 53. try: 54. environ = cherrypy.request.wsgi_environ.copy() 55. environ['SCRIPT_NAME'] = cherrypy.request.script_name 56. environ['PATH_INFO'] = cherrypy.request.path_info 57. except AttributeError: 58. environ = make_environ() 59. 60. if env: 61. environ.update(env) 62. 63. # run the wsgi app and have it set response.body 64. response = app(environ, start_response) 65. try: 66. cherrypy.response.body = [x for x in response] 67. finally: 68. if hasattr(response, "close"): 69. response.close() 70. 71. return True 72.