diff options
Diffstat (limited to 'webapp.py')
-rwxr-xr-x | webapp.py | 45 |
1 files changed, 33 insertions, 12 deletions
@@ -1,5 +1,6 @@ #!/usr/bin/python +import datetime import sqlite3 from wsgiref.simple_server import make_server @@ -10,6 +11,7 @@ from werkzeug.wrappers import Request, Response hash_functions = [ ("sha512", "sha512"), + ("image_sha512", "image_sha512"), ("gzip_sha512", "gzip_sha512"), ("sha512", "gzip_sha512"), ("gzip_sha512", "sha512")] @@ -104,6 +106,29 @@ index_template = jinjaenv.from_string( </ul> {% endblock %}""") +def fetchiter(cursor): + rows = cursor.fetchmany() + while rows: + for row in rows: + yield row + rows = cursor.fetchmany() + +def encode_and_buffer(iterator): + buff = b"" + for elem in iterator: + buff += elem.encode("utf8") + if len(buff) >= 2048: + yield buff + buff = b"" + if buff: + yield buff + +def html_response(unicode_iterator, max_age=24 * 60 * 60): + resp = Response(encode_and_buffer(unicode_iterator), mimetype="text/html") + resp.cache_control.max_age = max_age + resp.expires = datetime.datetime.now() + datetime.timedelta(seconds=max_age) + return resp + class Application(object): def __init__(self): self.db = sqlite3.connect("test.sqlite3") @@ -129,8 +154,7 @@ class Application(object): elif endpoint == "index": if not request.environ["PATH_INFO"]: raise RequestRedirect(request.environ["SCRIPT_NAME"] + "/") - return Response(index_template.render().encode("utf8"), - content_type="text/html") + return html_response(index_template.stream()) raise NotFound() except HTTPException as e: return e @@ -154,7 +178,7 @@ class Application(object): def get_dependencies(self, package): self.cur.execute("SELECT required FROM dependency WHERE package = ?;", (package,)) - return set(row[0] for row in self.cur.fetchall()) + return set(row[0] for row in fetchiter(self.cur)) def show_package(self, package): params = self.get_details(package) @@ -165,7 +189,7 @@ class Application(object): self.cur.execute("SELECT a.filename, a.hash, a.size, b.package FROM content AS a JOIN content AS b ON a.hash = b.hash WHERE a.package = ? AND a.function = ? AND b.function = ? AND (a.filename != b.filename OR b.package != ?);", (package, func1, func2, package)) sharing = dict() - for afile, hashval, size, bpkg in self.cur.fetchall(): + for afile, hashval, size, bpkg in fetchiter(self.cur): hashdict = sharing.setdefault(bpkg, dict()) fileset = hashdict.setdefault(hashval, (size, set()))[1] fileset.add(afile) @@ -186,8 +210,7 @@ class Application(object): curstats.append(dict(package=pkg, duplicate=duplicate, savable=savable)) params["shared"] = sharedstats - return Response(package_template.render(**params).encode("utf8"), - content_type="text/html") + return html_response(package_template.render(params)) def show_detail(self, package1, package2): if package1 == package2: @@ -203,7 +226,7 @@ class Application(object): (package1, package2)) shared = dict() - for filename1, size1, func1, filename2, size2, func2, hashvalue in self.cur.fetchall(): + for filename1, size1, func1, filename2, size2, func2, hashvalue in fetchiter(self.cur): funccomb = (func1, func2) if funccomb not in hash_functions: continue @@ -218,21 +241,19 @@ class Application(object): details1=details1, details2=details2, shared=shared) - return Response(detail_template.render(**params).encode("utf8"), - content_type="text/html") + return html_response(detail_template.render(params)) def show_hash(self, function, hashvalue): self.cur.execute("SELECT package, filename, size, function FROM content WHERE hash = ?;", (hashvalue,)) entries = [dict(package=package, filename=filename, size=size, function=otherfunc) - for package, filename, size, otherfunc in self.cur.fetchall() + for package, filename, size, otherfunc in fetchiter(self.cur) if (function, otherfunc) in hash_functions] if not entries: raise NotFound() params = dict(function=function, hashvalue=hashvalue, entries=entries) - return Response(hash_template.render(**params).encode("utf8"), - content_type="text/html") + return html_response(hash_template.render(params)) def main(): app = Application() |