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