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

_internal.py (12197B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\carbon\common\lib\werkzeug\_internal.py
      2 import inspect
      3 from weakref import WeakKeyDictionary
      4 from cStringIO import StringIO
      5 from Cookie import BaseCookie, Morsel, CookieError
      6 from time import gmtime
      7 from datetime import datetime, date
      8 _logger = None
      9 _empty_stream = StringIO('')
     10 _signature_cache = WeakKeyDictionary()
     11 _epoch_ord = date(1970, 1, 1).toordinal()
     12 HTTP_STATUS_CODES = {100: 'Continue',
     13  101: 'Switching Protocols',
     14  102: 'Processing',
     15  200: 'OK',
     16  201: 'Created',
     17  202: 'Accepted',
     18  203: 'Non Authoritative Information',
     19  204: 'No Content',
     20  205: 'Reset Content',
     21  206: 'Partial Content',
     22  207: 'Multi Status',
     23  226: 'IM Used',
     24  300: 'Multiple Choices',
     25  301: 'Moved Permanently',
     26  302: 'Found',
     27  303: 'See Other',
     28  304: 'Not Modified',
     29  305: 'Use Proxy',
     30  307: 'Temporary Redirect',
     31  400: 'Bad Request',
     32  401: 'Unauthorized',
     33  402: 'Payment Required',
     34  403: 'Forbidden',
     35  404: 'Not Found',
     36  405: 'Method Not Allowed',
     37  406: 'Not Acceptable',
     38  407: 'Proxy Authentication Required',
     39  408: 'Request Timeout',
     40  409: 'Conflict',
     41  410: 'Gone',
     42  411: 'Length Required',
     43  412: 'Precondition Failed',
     44  413: 'Request Entity Too Large',
     45  414: 'Request URI Too Long',
     46  415: 'Unsupported Media Type',
     47  416: 'Requested Range Not Satisfiable',
     48  417: 'Expectation Failed',
     49  418: "I'm a teapot",
     50  422: 'Unprocessable Entity',
     51  423: 'Locked',
     52  424: 'Failed Dependency',
     53  426: 'Upgrade Required',
     54  449: 'Retry With',
     55  500: 'Internal Server Error',
     56  501: 'Not Implemented',
     57  502: 'Bad Gateway',
     58  503: 'Service Unavailable',
     59  504: 'Gateway Timeout',
     60  505: 'HTTP Version Not Supported',
     61  507: 'Insufficient Storage',
     62  510: 'Not Extended'}
     63 
     64 class _Missing(object):
     65 
     66     def __repr__(self):
     67         return 'no value'
     68 
     69     def __reduce__(self):
     70         return '_missing'
     71 
     72 
     73 _missing = _Missing()
     74 
     75 def _proxy_repr(cls):
     76 
     77     def proxy_repr(self):
     78         return '%s(%s)' % (self.__class__.__name__, cls.__repr__(self))
     79 
     80     return proxy_repr
     81 
     82 
     83 def _get_environ(obj):
     84     env = getattr(obj, 'environ', obj)
     85     return env
     86 
     87 
     88 def _log(type, message, *args, **kwargs):
     89     global _logger
     90     if _logger is None:
     91         import logging
     92         _logger = logging.getLogger('werkzeug')
     93         if not logging.root.handlers and _logger.level == logging.NOTSET:
     94             _logger.setLevel(logging.INFO)
     95             handler = logging.StreamHandler()
     96             _logger.addHandler(handler)
     97     getattr(_logger, type)(message.rstrip(), *args, **kwargs)
     98 
     99 
    100 def _parse_signature(func):
    101     if hasattr(func, 'im_func'):
    102         func = func.im_func
    103     parse = _signature_cache.get(func)
    104     if parse is not None:
    105         return parse
    106     positional, vararg_var, kwarg_var, defaults = inspect.getargspec(func)
    107     defaults = defaults or ()
    108     arg_count = len(positional)
    109     arguments = []
    110     for idx, name in enumerate(positional):
    111         if isinstance(name, list):
    112             raise TypeError('cannot parse functions that unpack tuples in the function signature')
    113         try:
    114             default = defaults[idx - arg_count]
    115         except IndexError:
    116             param = (name, False, None)
    117         else:
    118             param = (name, True, default)
    119 
    120         arguments.append(param)
    121 
    122     arguments = tuple(arguments)
    123 
    124     def parse(args, kwargs):
    125         new_args = []
    126         missing = []
    127         extra = {}
    128         for idx, (name, has_default, default) in enumerate(arguments):
    129             try:
    130                 new_args.append(args[idx])
    131             except IndexError:
    132                 try:
    133                     new_args.append(kwargs.pop(name))
    134                 except KeyError:
    135                     if has_default:
    136                         new_args.append(default)
    137                     else:
    138                         missing.append(name)
    139 
    140             else:
    141                 if name in kwargs:
    142                     extra[name] = kwargs.pop(name)
    143 
    144         extra_positional = args[arg_count:]
    145         if vararg_var is not None:
    146             new_args.extend(extra_positional)
    147             extra_positional = ()
    148         if kwargs and kwarg_var is None:
    149             extra.update(kwargs)
    150             kwargs = {}
    151         return (new_args,
    152          kwargs,
    153          missing,
    154          extra,
    155          extra_positional,
    156          arguments,
    157          vararg_var,
    158          kwarg_var)
    159 
    160     _signature_cache[func] = parse
    161     return parse
    162 
    163 
    164 def _patch_wrapper(old, new):
    165     try:
    166         new.__name__ = old.__name__
    167         new.__module__ = old.__module__
    168         new.__doc__ = old.__doc__
    169         new.__dict__ = old.__dict__
    170     except:
    171         pass
    172 
    173     return new
    174 
    175 
    176 def _decode_unicode(value, charset, errors):
    177     fallback = None
    178     if errors.startswith('fallback:'):
    179         fallback = errors[9:]
    180         errors = 'strict'
    181     try:
    182         return value.decode(charset, errors)
    183     except UnicodeError as e:
    184         if fallback is not None:
    185             return value.decode(fallback, 'ignore')
    186         from werkzeug.exceptions import HTTPUnicodeError
    187         raise HTTPUnicodeError(str(e))
    188 
    189 
    190 def _iter_modules(path):
    191     import os
    192     import pkgutil
    193     if hasattr(pkgutil, 'iter_modules'):
    194         for importer, modname, ispkg in pkgutil.iter_modules(path):
    195             yield (modname, ispkg)
    196 
    197         return
    198     from inspect import getmodulename
    199     from pydoc import ispackage
    200     found = set()
    201     for path in path:
    202         for filename in os.listdir(path):
    203             p = os.path.join(path, filename)
    204             modname = getmodulename(filename)
    205             if modname and modname != '__init__':
    206                 if modname not in found:
    207                     found.add(modname)
    208                     yield (modname, ispackage(modname))
    209 
    210 
    211 def _dump_date(d, delim):
    212     if d is None:
    213         d = gmtime()
    214     elif isinstance(d, datetime):
    215         d = d.utctimetuple()
    216     elif isinstance(d, (int, long, float)):
    217         d = gmtime(d)
    218     return '%s, %02d%s%s%s%s %02d:%02d:%02d GMT' % (('Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun')[d.tm_wday],
    219      d.tm_mday,
    220      delim,
    221      ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec')[d.tm_mon - 1],
    222      delim,
    223      str(d.tm_year),
    224      d.tm_hour,
    225      d.tm_min,
    226      d.tm_sec)
    227 
    228 
    229 def _date_to_unix(arg):
    230     if isinstance(arg, datetime):
    231         arg = arg.utctimetuple()
    232     elif isinstance(arg, (int, long, float)):
    233         return int(arg)
    234     year, month, day, hour, minute, second = arg[:6]
    235     days = date(year, month, 1).toordinal() - _epoch_ord + day - 1
    236     hours = days * 24 + hour
    237     minutes = hours * 60 + minute
    238     seconds = minutes * 60 + second
    239     return seconds
    240 
    241 
    242 class _ExtendedMorsel(Morsel):
    243     _reserved = {'httponly': 'HttpOnly'}
    244     _reserved.update(Morsel._reserved)
    245 
    246     def __init__(self, name = None, value = None):
    247         Morsel.__init__(self)
    248         if name is not None:
    249             self.set(name, value, value)
    250 
    251     def OutputString(self, attrs = None):
    252         httponly = self.pop('httponly', False)
    253         result = Morsel.OutputString(self, attrs).rstrip('\t ;')
    254         if httponly:
    255             result += '; HttpOnly'
    256         return result
    257 
    258 
    259 class _ExtendedCookie(BaseCookie):
    260 
    261     def _BaseCookie__set(self, key, real_value, coded_value):
    262         morsel = self.get(key, _ExtendedMorsel())
    263         try:
    264             morsel.set(key, real_value, coded_value)
    265         except CookieError:
    266             pass
    267 
    268         dict.__setitem__(self, key, morsel)
    269 
    270 
    271 class _DictAccessorProperty(object):
    272     read_only = False
    273 
    274     def __init__(self, name, default = None, load_func = None, dump_func = None, read_only = None, doc = None):
    275         self.name = name
    276         self.default = default
    277         self.load_func = load_func
    278         self.dump_func = dump_func
    279         if read_only is not None:
    280             self.read_only = read_only
    281         self.__doc__ = doc
    282 
    283     def __get__(self, obj, type = None):
    284         if obj is None:
    285             return self
    286         storage = self.lookup(obj)
    287         if self.name not in storage:
    288             return self.default
    289         rv = storage[self.name]
    290         if self.load_func is not None:
    291             try:
    292                 rv = self.load_func(rv)
    293             except (ValueError, TypeError):
    294                 rv = self.default
    295 
    296         return rv
    297 
    298     def __set__(self, obj, value):
    299         if self.read_only:
    300             raise AttributeError('read only property')
    301         if self.dump_func is not None:
    302             value = self.dump_func(value)
    303         self.lookup(obj)[self.name] = value
    304 
    305     def __delete__(self, obj):
    306         if self.read_only:
    307             raise AttributeError('read only property')
    308         self.lookup(obj).pop(self.name, None)
    309 
    310     def __repr__(self):
    311         return '<%s %s>' % (self.__class__.__name__, self.name)
    312 
    313 
    314 def _easteregg(app):
    315     gyver = '\n'.join([ x + (77 - len(x)) * ' ' for x in '\n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\n7f2zLkGNv8b191cD/3vs9Q833z8t'.decode('base64').decode('zlib').splitlines() ])
    316 
    317     def easteregged(environ, start_response):
    318 
    319         def injecting_start_response(status, headers, exc_info = None):
    320             headers.append(('X-Powered-By', 'Werkzeug'))
    321             return start_response(status, headers, exc_info)
    322 
    323         if environ.get('QUERY_STRING') != 'macgybarchakku':
    324             return app(environ, injecting_start_response)
    325         injecting_start_response('200 OK', [('Content-Type', 'text/html')])
    326         return ['<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">\n<title>About Werkzeug</>\n<style type="text/css">\n  body { font: 15px Georgia, serif; text-align: center; }\n  a { color: #333; text-decoration: none; }\n  h1 { font-size: 30px; margin: 20px 0 10px 0; }\n  p { margin: 0 0 30px 0; }\n  pre { font: 11px \'Consolas\', \'Monaco\', monospace; line-height: 0.95; }\n</style>\n<h1><a href="http://werkzeug.pocoo.org/">Werkzeug</a></h1>\n<p>the Swiss Army knife of Python web development.\n<pre>%s\n\n\n</>' % gyver]
    327 
    328     return easteregged