NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

_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)