def _iter_chunked(self, read, bufsize): err = HTTPError(400, 'Error while parsing chunked transfer body.') rn, sem, bs = settings.tob('\r\n'), settings.tob(';'), settings.tob('') while True: header = read(1) while header[-2:] != rn: c = read(1) header += c if not c: raise err if len(header) > bufsize: raise err size, _, _ = header.partition(sem) try: maxread = int(settings.tonat(size.strip()), 16) except ValueError: raise err if maxread == 0: break buff = bs while maxread > 0: if not buff: buff = read(min(maxread, bufsize)) part, buff = buff[:maxread], buff[maxread:] if not part: raise err yield part maxread -= len(part) if read(2) != rn: raise err
def cookie_encode(data, key): ''' Encode and sign a pickle-able object. Return a (byte) string ''' msg = settings.base64.b64encode(settings.pickle.dumps(data, -1)) sig = settings.base64.b64encode( settings.hmac.new(settings.tob(key), msg, digestmod=settings.hashlib.md5).digest()) return settings.tob('!') + sig + settings.tob('?') + msg
def cookie_decode(data, key): ''' Verify and decode an encoded string. Return an object or None.''' data = settings.tob(data) if cookie_is_encoded(data): sig, msg = data.split(settings.tob('?'), 1) if _lscmp( sig[1:], settings.base64.b64encode( settings.hmac.new( settings.tob(key), msg, digestmod=settings.hashlib.md5).digest())): return settings.pickle.loads(settings.base64.b64decode(msg)) return None
def wsgi(self, environ, start_response): """ The bottle WSGI-interface. """ try: out = self._cast(self._handle(environ)) # rfc2616 section 4.3 if http_wsgi.response._status_code in ( 100, 101, 204, 304) or environ['REQUEST_METHOD'] == 'HEAD': if hasattr(out, 'close'): out.close() out = [] start_response(http_wsgi.response._status_line, http_wsgi.response.headerlist) return out except (KeyboardInterrupt, SystemExit, MemoryError): raise except Exception: if not self.catchall: raise err = '<h1>Critical error while processing request: %s</h1>' \ % http_wsgi.html_escape(environ.get('PATH_INFO', '/')) if settings.DEBUG: err += '<h2>Error:</h2>\n<pre>\n%s\n</pre>\n' \ '<h2>Traceback:</h2>\n<pre>\n%s\n</pre>\n' \ % (http_wsgi.html_escape(repr(settings._e())), http_wsgi.html_escape(settings.format_exc())) environ['wsgi.errors'].write(err) headers = [('Content-Type', 'text/html; charset=UTF-8')] start_response('500 INTERNAL SERVER ERROR', headers, sys.exc_info()) return [settings.tob(err)]
def parse_auth(header): """ Parse rfc2617 HTTP authentication header string (basic) and return (user,pass) tuple or None""" try: method, data = header.split(None, 1) if method.lower() == 'basic': user, pwd = settings.touni( settings.base64.b64decode(settings.tob(data))).split(':', 1) return user, pwd except (KeyError, ValueError): return None
def cookie_is_encoded(data): ''' Return True if the argument looks like a encoded cookie.''' return bool( data.startswith(settings.tob('!')) and settings.tob('?') in data)
def default_error_handler(self, res): return settings.tob( template_adapters.template(settings.ERROR_PAGE_TEMPLATE, e=res))