_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