_cpnative_server.py (4854B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\carbon\common\lib\cherrypy\_cpnative_server.py 2 import logging 3 import sys 4 import cherrypy 5 from cherrypy._cpcompat import BytesIO 6 from cherrypy._cperror import format_exc, bare_error 7 from cherrypy.lib import httputil 8 from cherrypy import wsgiserver 9 10 class NativeGateway(wsgiserver.Gateway): 11 recursive = False 12 13 def respond(self): 14 req = self.req 15 try: 16 local = req.server.bind_addr 17 local = httputil.Host(local[0], local[1], '') 18 remote = (req.conn.remote_addr, req.conn.remote_port) 19 remote = httputil.Host(remote[0], remote[1], '') 20 scheme = req.scheme 21 sn = cherrypy.tree.script_name(req.uri or '/') 22 if sn is None: 23 self.send_response('404 Not Found', [], ['']) 24 else: 25 app = cherrypy.tree.apps[sn] 26 method = req.method 27 path = req.path 28 qs = req.qs or '' 29 headers = req.inheaders.items() 30 rfile = req.rfile 31 prev = None 32 try: 33 redirections = [] 34 while True: 35 request, response = app.get_serving(local, remote, scheme, 'HTTP/1.1') 36 request.multithread = True 37 request.multiprocess = False 38 request.app = app 39 request.prev = prev 40 try: 41 request.run(method, path, qs, req.request_protocol, headers, rfile) 42 break 43 except cherrypy.InternalRedirect: 44 ir = sys.exc_info()[1] 45 app.release_serving() 46 prev = request 47 if not self.recursive: 48 if ir.path in redirections: 49 raise RuntimeError('InternalRedirector visited the same URL twice: %r' % ir.path) 50 else: 51 if qs: 52 qs = '?' + qs 53 redirections.append(sn + path + qs) 54 method = 'GET' 55 path = ir.path 56 qs = ir.query_string 57 rfile = BytesIO() 58 59 self.send_response(response.output_status, response.header_list, response.body) 60 finally: 61 app.release_serving() 62 63 except: 64 tb = format_exc() 65 cherrypy.log(tb, 'NATIVE_ADAPTER', severity=logging.ERROR) 66 s, h, b = bare_error() 67 self.send_response(s, h, b) 68 69 def send_response(self, status, headers, body): 70 req = self.req 71 req.status = str(status or '500 Server Error') 72 for header, value in headers: 73 req.outheaders.append((header, value)) 74 75 if req.ready and not req.sent_headers: 76 req.sent_headers = True 77 req.send_headers() 78 for seg in body: 79 req.write(seg) 80 81 82 class CPHTTPServer(wsgiserver.HTTPServer): 83 84 def __init__(self, server_adapter = cherrypy.server): 85 self.server_adapter = server_adapter 86 server_name = self.server_adapter.socket_host or self.server_adapter.socket_file or None 87 wsgiserver.HTTPServer.__init__(self, server_adapter.bind_addr, NativeGateway, minthreads=server_adapter.thread_pool, maxthreads=server_adapter.thread_pool_max, server_name=server_name) 88 self.max_request_header_size = self.server_adapter.max_request_header_size or 0 89 self.max_request_body_size = self.server_adapter.max_request_body_size or 0 90 self.request_queue_size = self.server_adapter.socket_queue_size 91 self.timeout = self.server_adapter.socket_timeout 92 self.shutdown_timeout = self.server_adapter.shutdown_timeout 93 self.protocol = self.server_adapter.protocol_version 94 self.nodelay = self.server_adapter.nodelay 95 ssl_module = self.server_adapter.ssl_module or 'pyopenssl' 96 if self.server_adapter.ssl_context: 97 adapter_class = wsgiserver.get_ssl_adapter_class(ssl_module) 98 self.ssl_adapter = adapter_class(self.server_adapter.ssl_certificate, self.server_adapter.ssl_private_key, self.server_adapter.ssl_certificate_chain) 99 self.ssl_adapter.context = self.server_adapter.ssl_context 100 elif self.server_adapter.ssl_certificate: 101 adapter_class = wsgiserver.get_ssl_adapter_class(ssl_module) 102 self.ssl_adapter = adapter_class(self.server_adapter.ssl_certificate, self.server_adapter.ssl_private_key, self.server_adapter.ssl_certificate_chain)