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

simple_server.py (3805B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\carbon\common\lib\wsgiref\simple_server.py
      2 from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
      3 import urllib, sys
      4 from wsgiref.handlers import SimpleHandler
      5 __version__ = '0.1'
      6 __all__ = ['WSGIServer',
      7  'WSGIRequestHandler',
      8  'demo_app',
      9  'make_server']
     10 server_version = 'WSGIServer/' + __version__
     11 sys_version = 'Python/' + sys.version.split()[0]
     12 software_version = server_version + ' ' + sys_version
     13 
     14 class ServerHandler(SimpleHandler):
     15     server_software = software_version
     16 
     17     def close(self):
     18         try:
     19             self.request_handler.log_request(self.status.split(' ', 1)[0], self.bytes_sent)
     20         finally:
     21             SimpleHandler.close(self)
     22 
     23 
     24 class WSGIServer(HTTPServer):
     25     application = None
     26 
     27     def server_bind(self):
     28         HTTPServer.server_bind(self)
     29         self.setup_environ()
     30 
     31     def setup_environ(self):
     32         env = self.base_environ = {}
     33         env['SERVER_NAME'] = self.server_name
     34         env['GATEWAY_INTERFACE'] = 'CGI/1.1'
     35         env['SERVER_PORT'] = str(self.server_port)
     36         env['REMOTE_HOST'] = ''
     37         env['CONTENT_LENGTH'] = ''
     38         env['SCRIPT_NAME'] = ''
     39 
     40     def get_app(self):
     41         return self.application
     42 
     43     def set_app(self, application):
     44         self.application = application
     45 
     46 
     47 class WSGIRequestHandler(BaseHTTPRequestHandler):
     48     server_version = 'WSGIServer/' + __version__
     49 
     50     def get_environ(self):
     51         env = self.server.base_environ.copy()
     52         env['SERVER_PROTOCOL'] = self.request_version
     53         env['REQUEST_METHOD'] = self.command
     54         if '?' in self.path:
     55             path, query = self.path.split('?', 1)
     56         else:
     57             path, query = self.path, ''
     58         env['PATH_INFO'] = urllib.unquote(path)
     59         env['QUERY_STRING'] = query
     60         host = self.address_string()
     61         if host != self.client_address[0]:
     62             env['REMOTE_HOST'] = host
     63         env['REMOTE_ADDR'] = self.client_address[0]
     64         if self.headers.typeheader is None:
     65             env['CONTENT_TYPE'] = self.headers.type
     66         else:
     67             env['CONTENT_TYPE'] = self.headers.typeheader
     68         length = self.headers.getheader('content-length')
     69         if length:
     70             env['CONTENT_LENGTH'] = length
     71         for h in self.headers.headers:
     72             k, v = h.split(':', 1)
     73             k = k.replace('-', '_').upper()
     74             v = v.strip()
     75             if k in env:
     76                 continue
     77             if 'HTTP_' + k in env:
     78                 env['HTTP_' + k] += ',' + v
     79             else:
     80                 env['HTTP_' + k] = v
     81 
     82         return env
     83 
     84     def get_stderr(self):
     85         return sys.stderr
     86 
     87     def handle(self):
     88         self.raw_requestline = self.rfile.readline()
     89         if not self.parse_request():
     90             return
     91         handler = ServerHandler(self.rfile, self.wfile, self.get_stderr(), self.get_environ())
     92         handler.request_handler = self
     93         handler.run(self.server.get_app())
     94 
     95 
     96 def demo_app(environ, start_response):
     97     from StringIO import StringIO
     98     stdout = StringIO()
     99     print >> stdout, 'Hello world!'
    100     print >> stdout
    101     h = environ.items()
    102     h.sort()
    103     for k, v in h:
    104         print >> stdout, k, '=', repr(v)
    105 
    106     start_response('200 OK', [('Content-Type', 'text/plain')])
    107     return [stdout.getvalue()]
    108 
    109 
    110 def make_server(host, port, app, server_class = WSGIServer, handler_class = WSGIRequestHandler):
    111     server = server_class((host, port), handler_class)
    112     server.set_app(app)
    113     return server
    114 
    115 
    116 if __name__ == '__main__':
    117     httpd = make_server('', 8000, demo_app)
    118     sa = httpd.socket.getsockname()
    119     print 'Serving HTTP on', sa[0], 'port', sa[1], '...'
    120     import webbrowser
    121     webbrowser.open('http://localhost:8000/xyz?abc')
    122     httpd.handle_request()