# HG changeset patch # User Jeff Hammel # Date 1330982145 28800 # Node ID 395c6744bcd9e9fcfb4197e633855ccc6281957f # Parent f1f53fa1e851eeaff4895c7643ea550db08623fa upgrading with suggestions from http://docs.webob.org/en/latest/file-example.html diff -r f1f53fa1e851 -r 395c6744bcd9 fileserver/web.py --- a/fileserver/web.py Fri Mar 02 12:50:52 2012 -0800 +++ b/fileserver/web.py Mon Mar 05 13:15:45 2012 -0800 @@ -16,6 +16,27 @@ __all__ = ['get_mimetype', 'file_response', 'FileApp', 'DirectoryServer', 'main'] +### classes for iterating over files + +class FileIterable(object): + def __init__(self, filename): + self.filename = filename + def __iter__(self): + return FileIterator(self.filename) +class FileIterator(object): + def __init__(self, filename, chunk_size=4096): + self.filename = filename + self.chunk_size = chunk_size + self.fileobj = open(self.filename, 'rb') + def __iter__(self): + return self + def next(self): + chunk = self.fileobj.read(self.chunk_size) + if not chunk: + raise StopIteration + return chunk + __next__ = next # py3 compat + def get_mimetype(filename): type, encoding = mimetypes.guess_type(filename) # We'll ignore encoding, even though we shouldn't really @@ -23,8 +44,13 @@ def file_response(filename): """return a webob response object appropriate to a file name""" - res = Response(content_type=get_mimetype(filename)) - res.body = open(filename, 'rb').read() + res = Response(content_type=get_mimetype(filename), + conditional_response=True) + res.app_iter = FileIterable(filename) + res.content_length = os.path.getsize(filename) + res.last_modified = os.path.getmtime(filename) + res.etag = '%s-%s-%s' % (os.path.getmtime(filename), + os.path.getsize(filename), hash(filename)) return res class FileApp(object):