util.py (3764B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\carbon\common\lib\wsgiref\util.py 2 import posixpath 3 __all__ = ['FileWrapper', 4 'guess_scheme', 5 'application_uri', 6 'request_uri', 7 'shift_path_info', 8 'setup_testing_defaults'] 9 10 class FileWrapper: 11 12 def __init__(self, filelike, blksize = 8192): 13 self.filelike = filelike 14 self.blksize = blksize 15 if hasattr(filelike, 'close'): 16 self.close = filelike.close 17 18 def __getitem__(self, key): 19 data = self.filelike.read(self.blksize) 20 if data: 21 return data 22 raise IndexError 23 24 def __iter__(self): 25 return self 26 27 def next(self): 28 data = self.filelike.read(self.blksize) 29 if data: 30 return data 31 raise StopIteration 32 33 34 def guess_scheme(environ): 35 if environ.get('HTTPS') in ('yes', 'on', '1'): 36 return 'https' 37 else: 38 return 'http' 39 40 41 def application_uri(environ): 42 url = environ['wsgi.url_scheme'] + '://' 43 from urllib import quote 44 if environ.get('HTTP_HOST'): 45 url += environ['HTTP_HOST'] 46 else: 47 url += environ['SERVER_NAME'] 48 if environ['wsgi.url_scheme'] == 'https': 49 if environ['SERVER_PORT'] != '443': 50 url += ':' + environ['SERVER_PORT'] 51 elif environ['SERVER_PORT'] != '80': 52 url += ':' + environ['SERVER_PORT'] 53 url += quote(environ.get('SCRIPT_NAME') or '/') 54 return url 55 56 57 def request_uri(environ, include_query = 1): 58 url = application_uri(environ) 59 from urllib import quote 60 path_info = quote(environ.get('PATH_INFO', '')) 61 if not environ.get('SCRIPT_NAME'): 62 url += path_info[1:] 63 else: 64 url += path_info 65 if include_query and environ.get('QUERY_STRING'): 66 url += '?' + environ['QUERY_STRING'] 67 return url 68 69 70 def shift_path_info(environ): 71 path_info = environ.get('PATH_INFO', '') 72 if not path_info: 73 return 74 path_parts = path_info.split('/') 75 path_parts[1:-1] = [ p for p in path_parts[1:-1] if p and p != '.' ] 76 name = path_parts[1] 77 del path_parts[1] 78 script_name = environ.get('SCRIPT_NAME', '') 79 script_name = posixpath.normpath(script_name + '/' + name) 80 if script_name.endswith('/'): 81 script_name = script_name[:-1] 82 if not name and not script_name.endswith('/'): 83 script_name += '/' 84 environ['SCRIPT_NAME'] = script_name 85 environ['PATH_INFO'] = '/'.join(path_parts) 86 if name == '.': 87 name = None 88 return name 89 90 91 def setup_testing_defaults(environ): 92 environ.setdefault('SERVER_NAME', '127.0.0.1') 93 environ.setdefault('SERVER_PROTOCOL', 'HTTP/1.0') 94 environ.setdefault('HTTP_HOST', environ['SERVER_NAME']) 95 environ.setdefault('REQUEST_METHOD', 'GET') 96 if 'SCRIPT_NAME' not in environ and 'PATH_INFO' not in environ: 97 environ.setdefault('SCRIPT_NAME', '') 98 environ.setdefault('PATH_INFO', '/') 99 environ.setdefault('wsgi.version', (1, 0)) 100 environ.setdefault('wsgi.run_once', 0) 101 environ.setdefault('wsgi.multithread', 0) 102 environ.setdefault('wsgi.multiprocess', 0) 103 from StringIO import StringIO 104 environ.setdefault('wsgi.input', StringIO('')) 105 environ.setdefault('wsgi.errors', StringIO()) 106 environ.setdefault('wsgi.url_scheme', guess_scheme(environ)) 107 if environ['wsgi.url_scheme'] == 'http': 108 environ.setdefault('SERVER_PORT', '80') 109 elif environ['wsgi.url_scheme'] == 'https': 110 environ.setdefault('SERVER_PORT', '443') 111 112 113 _hoppish = {'connection': 1, 114 'keep-alive': 1, 115 'proxy-authenticate': 1, 116 'proxy-authorization': 1, 117 'te': 1, 118 'trailers': 1, 119 'transfer-encoding': 1, 120 'upgrade': 1}.__contains__ 121 122 def is_hop_by_hop(header_name): 123 return _hoppish(header_name.lower())