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

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)