Exemple #1
0
 def _iter_chunked(self, read, bufsize):
     err = HTTPError(400, 'Error while parsing chunked transfer body.')
     rn, sem, bs = tob('\r\n'), tob(';'), 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(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
Exemple #2
0
def cookie_decode(data, key):
    ''' Verify and decode an encoded string. Return an object or None.'''
    data = tob(data)
    if cookie_is_encoded(data):
        sig, msg = data.split(tob('?'), 1)
        if _lscmp(sig[1:], base64.b64encode(hmac.new(tob(key), msg).digest())):
            return pickle.loads(base64.b64decode(msg))
    return None
Exemple #3
0
 def wsgi(self, environ, start_response):
     """ The bottle WSGI-interface. """
     try:
         out = self._cast(self._handle(environ))
         # rfc2616 section 4.3
         if response._status_code in (100, 101, 204, 304)\
         or environ['REQUEST_METHOD'] == 'HEAD':
             if hasattr(out, 'close'): out.close()
             out = []
         start_response(response._status_line, 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>' \
               % html_escape(environ.get('PATH_INFO', '/'))
         if DEBUG:
             err += '<h2>Error:</h2>\n<pre>\n%s\n</pre>\n' \
                    '<h2>Traceback:</h2>\n<pre>\n%s\n</pre>\n' \
                    % (html_escape(repr(_e())), html_escape(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 [tob(err)]
Exemple #4
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 = touni(base64.b64decode(tob(data))).split(':', 1)
            return user, pwd
    except (KeyError, ValueError):
        return None
Exemple #5
0
 def default_error_handler(self, res):
     return tob(template(ERROR_PAGE_TEMPLATE, e=res))
Exemple #6
0
def cookie_encode(data, key):
    ''' Encode and sign a pickle-able object. Return a (byte) string '''
    msg = base64.b64encode(pickle.dumps(data, -1))
    sig = base64.b64encode(hmac.new(tob(key), msg).digest())
    return tob('!') + sig + tob('?') + msg
Exemple #7
0
def cookie_is_encoded(data):
    ''' Return True if the argument looks like a encoded cookie.'''
    return bool(data.startswith(tob('!')) and tob('?') in data)