fixers.py (4480B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\carbon\common\lib\werkzeug\contrib\fixers.py 2 from urllib import unquote 3 from werkzeug.http import parse_options_header, parse_cache_control_header, parse_set_header, dump_header 4 from werkzeug.useragents import UserAgent 5 from werkzeug.datastructures import Headers, ResponseCacheControl 6 7 class LighttpdCGIRootFix(object): 8 9 def __init__(self, app): 10 self.app = app 11 12 def __call__(self, environ, start_response): 13 environ['PATH_INFO'] = environ.get('SCRIPT_NAME', '') + environ.get('PATH_INFO', '') 14 environ['SCRIPT_NAME'] = '' 15 return self.app(environ, start_response) 16 17 18 class PathInfoFromRequestUriFix(object): 19 20 def __init__(self, app): 21 self.app = app 22 23 def __call__(self, environ, start_response): 24 for key in ('REQUEST_URL', 'REQUEST_URI', 'UNENCODED_URL'): 25 if key not in environ: 26 continue 27 request_uri = unquote(environ[key]) 28 script_name = unquote(environ.get('SCRIPT_NAME', '')) 29 if request_uri.startswith(script_name): 30 environ['PATH_INFO'] = request_uri[len(script_name):].split('?', 1)[0] 31 break 32 33 return self.app(environ, start_response) 34 35 36 class ProxyFix(object): 37 38 def __init__(self, app): 39 self.app = app 40 41 def __call__(self, environ, start_response): 42 getter = environ.get 43 forwarded_for = getter('HTTP_X_FORWARDED_FOR', '').split(',') 44 forwarded_host = getter('HTTP_X_FORWARDED_HOST', '') 45 environ.update({'werkzeug.proxy_fix.orig_remote_addr': getter('REMOTE_ADDR'), 46 'werkzeug.proxy_fix.orig_http_host': getter('HTTP_HOST')}) 47 if forwarded_for: 48 environ['REMOTE_ADDR'] = forwarded_for[0].strip() 49 if forwarded_host: 50 environ['HTTP_HOST'] = forwarded_host 51 return self.app(environ, start_response) 52 53 54 class HeaderRewriterFix(object): 55 56 def __init__(self, app, remove_headers = None, add_headers = None): 57 self.app = app 58 self.remove_headers = set((x.lower() for x in remove_headers or ())) 59 self.add_headers = list(add_headers or ()) 60 61 def __call__(self, environ, start_response): 62 63 def rewriting_start_response(status, headers, exc_info = None): 64 new_headers = [] 65 for key, value in headers: 66 if key.lower() not in self.remove_headers: 67 new_headers.append((key, value)) 68 69 new_headers += self.add_headers 70 return start_response(status, new_headers, exc_info) 71 72 return self.app(environ, rewriting_start_response) 73 74 75 class InternetExplorerFix(object): 76 77 def __init__(self, app, fix_vary = True, fix_attach = True): 78 self.app = app 79 self.fix_vary = fix_vary 80 self.fix_attach = fix_attach 81 82 def fix_headers(self, environ, headers, status = None): 83 if self.fix_vary: 84 header = headers.get('content-type', '') 85 mimetype, options = parse_options_header(header) 86 if mimetype not in ('text/html', 'text/plain', 'text/sgml'): 87 headers.pop('vary', None) 88 if self.fix_attach and 'content-disposition' in headers: 89 pragma = parse_set_header(headers.get('pragma', '')) 90 pragma.discard('no-cache') 91 header = pragma.to_header() 92 if not header: 93 headers.pop('pragma', '') 94 else: 95 headers['Pragma'] = header 96 header = headers.get('cache-control', '') 97 if header: 98 cc = parse_cache_control_header(header, cls=ResponseCacheControl) 99 cc.no_cache = None 100 cc.no_store = False 101 header = cc.to_header() 102 if not header: 103 headers.pop('cache-control', '') 104 else: 105 headers['Cache-Control'] = header 106 107 def run_fixed(self, environ, start_response): 108 109 def fixing_start_response(status, headers, exc_info = None): 110 self.fix_headers(environ, Headers.linked(headers), status) 111 return start_response(status, headers, exc_info) 112 113 return self.app(environ, fixing_start_response) 114 115 def __call__(self, environ, start_response): 116 ua = UserAgent(environ) 117 if ua.browser != 'msie': 118 return self.app(environ, start_response) 119 return self.run_fixed(environ, start_response)