Ejemplo n.º 1
0
 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
Ejemplo n.º 2
0
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
Ejemplo n.º 3
0
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
Ejemplo n.º 4
0
 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)]
Ejemplo n.º 5
0
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
Ejemplo n.º 6
0
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)
Ejemplo n.º 7
0
 def default_error_handler(self, res):
     return settings.tob(
         template_adapters.template(settings.ERROR_PAGE_TEMPLATE, e=res))