Home | Trees | Indices | Help |
|
---|
|
1 """Native adapter for serving CherryPy via its builtin server.""" 2 3 import logging 4 import sys 5 6 import cherrypy 7 from cherrypy._cpcompat import BytesIO 8 from cherrypy._cperror import format_exc, bare_error 9 from cherrypy.lib import httputil 10 from cherrypy import wsgiserver 11 1214 15 recursive = False 16106 10718 req = self.req 19 try: 20 # Obtain a Request object from CherryPy 21 local = req.server.bind_addr 22 local = httputil.Host(local[0], local[1], "") 23 remote = req.conn.remote_addr, req.conn.remote_port 24 remote = httputil.Host(remote[0], remote[1], "") 25 26 scheme = req.scheme 27 sn = cherrypy.tree.script_name(req.uri or "/") 28 if sn is None: 29 self.send_response('404 Not Found', [], ['']) 30 else: 31 app = cherrypy.tree.apps[sn] 32 method = req.method 33 path = req.path 34 qs = req.qs or "" 35 headers = req.inheaders.items() 36 rfile = req.rfile 37 prev = None 38 39 try: 40 redirections = [] 41 while True: 42 request, response = app.get_serving( 43 local, remote, scheme, "HTTP/1.1") 44 request.multithread = True 45 request.multiprocess = False 46 request.app = app 47 request.prev = prev 48 49 # Run the CherryPy Request object and obtain the 50 # response 51 try: 52 request.run(method, path, qs, 53 req.request_protocol, headers, rfile) 54 break 55 except cherrypy.InternalRedirect: 56 ir = sys.exc_info()[1] 57 app.release_serving() 58 prev = request 59 60 if not self.recursive: 61 if ir.path in redirections: 62 raise RuntimeError( 63 "InternalRedirector visited the same " 64 "URL twice: %r" % ir.path) 65 else: 66 # Add the *previous* path_info + qs to 67 # redirections. 68 if qs: 69 qs = "?" + qs 70 redirections.append(sn + path + qs) 71 72 # Munge environment and try again. 73 method = "GET" 74 path = ir.path 75 qs = ir.query_string 76 rfile = BytesIO() 77 78 self.send_response( 79 response.output_status, response.header_list, 80 response.body) 81 finally: 82 app.release_serving() 83 except: 84 tb = format_exc() 85 # print tb 86 cherrypy.log(tb, 'NATIVE_ADAPTER', severity=logging.ERROR) 87 s, h, b = bare_error() 88 self.send_response(s, h, b)8991 req = self.req 92 93 # Set response status 94 req.status = str(status or "500 Server Error") 95 96 # Set response headers 97 for header, value in headers: 98 req.outheaders.append((header, value)) 99 if (req.ready and not req.sent_headers): 100 req.sent_headers = True 101 req.send_headers() 102 103 # Set response body 104 for seg in body: 105 req.write(seg)109 110 """Wrapper for wsgiserver.HTTPServer. 111 112 wsgiserver has been designed to not reference CherryPy in any way, 113 so that it can be used in other frameworks and applications. 114 Therefore, we wrap it here, so we can apply some attributes 115 from config -> cherrypy.server -> HTTPServer. 116 """ 117155119 self.server_adapter = server_adapter 120 121 server_name = (self.server_adapter.socket_host or 122 self.server_adapter.socket_file or 123 None) 124 125 wsgiserver.HTTPServer.__init__( 126 self, server_adapter.bind_addr, NativeGateway, 127 minthreads=server_adapter.thread_pool, 128 maxthreads=server_adapter.thread_pool_max, 129 server_name=server_name) 130 131 self.max_request_header_size = ( 132 self.server_adapter.max_request_header_size or 0) 133 self.max_request_body_size = ( 134 self.server_adapter.max_request_body_size or 0) 135 self.request_queue_size = self.server_adapter.socket_queue_size 136 self.timeout = self.server_adapter.socket_timeout 137 self.shutdown_timeout = self.server_adapter.shutdown_timeout 138 self.protocol = self.server_adapter.protocol_version 139 self.nodelay = self.server_adapter.nodelay 140 141 ssl_module = self.server_adapter.ssl_module or 'pyopenssl' 142 if self.server_adapter.ssl_context: 143 adapter_class = wsgiserver.get_ssl_adapter_class(ssl_module) 144 self.ssl_adapter = adapter_class( 145 self.server_adapter.ssl_certificate, 146 self.server_adapter.ssl_private_key, 147 self.server_adapter.ssl_certificate_chain) 148 self.ssl_adapter.context = self.server_adapter.ssl_context 149 elif self.server_adapter.ssl_certificate: 150 adapter_class = wsgiserver.get_ssl_adapter_class(ssl_module) 151 self.ssl_adapter = adapter_class( 152 self.server_adapter.ssl_certificate, 153 self.server_adapter.ssl_private_key, 154 self.server_adapter.ssl_certificate_chain)
Home | Trees | Indices | Help |
|
---|
Generated by Epydoc 3.0.1 on Wed Jan 13 06:16:22 2016 | http://epydoc.sourceforge.net |