1
0
mirror of https://github.com/webrecorder/pywb.git synced 2025-03-26 07:49:24 +01:00
pywb/pywb/utils.py
Jack Cushman 3f04f63a3f wsgiref compatibility fixes.
- Manually set env[‘REQUEST_URI’] (which is nonstandard) the same way
it’s set by uwsgi.
- Include HTTP error code reasons in error response. (wsgiref checks
that error code is at least 4 characters, i.e. includes reason)
2014-01-19 15:08:14 -05:00

77 lines
1.9 KiB
Python

import itertools
import hmac
import time
import zlib
import time
def peek_iter(iterable):
try:
first = next(iterable)
except StopIteration:
return None
return itertools.chain([first], iterable)
def split_prefix(key, prefixs):
for p in prefixs:
if key.startswith(p):
plen = len(p)
return (key[:plen], key[plen:])
def create_decompressor():
return zlib.decompressobj(16 + zlib.MAX_WBITS)
class HMACCookieMaker:
def __init__(self, key, name):
self.key = key
self.name = name
def __call__(self, duration, extraId = ''):
expire = str(long(time.time() + duration))
if extraId:
msg = extraId + '-' + expire
else:
msg = expire
hmacdigest = hmac.new(self.key, msg)
hexdigest = hmacdigest.hexdigest()
if extraId:
cookie = '{0}-{1}={2}-{3}'.format(self.name, extraId, expire, hexdigest)
else:
cookie = '{0}={1}-{2}'.format(self.name, expire, hexdigest)
return cookie
#return cookie + hexdigest
# Adapted from example at
class PerfTimer:
def __init__(self, perfdict, name):
self.perfdict = perfdict
self.name = name
def __enter__(self):
self.start = time.clock()
return self
def __exit__(self, *args):
self.end = time.clock()
if self.perfdict is not None:
self.perfdict[self.name] = str(self.end - self.start)
# adapted from wsgiref.request_uri, but doesn't include domain name and allows ':' in url
def request_uri(environ, include_query=1):
"""Return the requested path, optionally including the query string"""
from urllib import quote
url = quote(environ.get('SCRIPT_NAME', '')+environ.get('PATH_INFO',''),safe='/;=,:')
if include_query and environ.get('QUERY_STRING'):
url += '?' + environ['QUERY_STRING']
return url