Mercurial > kallithea
changeset 2295:ab9a9d9940b0
merge with beta
author | Marcin Kuzminski <marcin@python-works.com> |
---|---|
date | Thu, 17 May 2012 02:44:45 +0200 |
parents | c5e1604ab342 (current diff) 3c1d991755df (diff) |
children | 6af522a8d76c |
files | rhodecode/controllers/files.py |
diffstat | 2 files changed, 21 insertions(+), 19 deletions(-) [+] |
line wrap: on
line diff
--- a/rhodecode/controllers/files.py Thu May 17 01:45:05 2012 +0200 +++ b/rhodecode/controllers/files.py Thu May 17 02:44:45 2012 +0200 @@ -32,6 +32,7 @@ from pylons.i18n.translation import _ from pylons.controllers.util import redirect from pylons.decorators import jsonify +from paste.fileapp import FileApp, _FileIter from rhodecode.lib import diffs from rhodecode.lib import helpers as h @@ -364,20 +365,22 @@ with open(_archive_name, 'wb') as f: cs.fill_archive(stream=f, kind=fileformat, subrepos=subrepos) - response.content_type = content_type - response.content_disposition = 'attachment; filename=%s-%s%s' \ + content_disposition = 'attachment; filename=%s-%s%s' \ % (repo_name, revision[:12], ext) - response.content_length = str(os.path.getsize(_archive_name)) + content_length = os.path.getsize(_archive_name) + + headers = [('Content-Disposition', str(content_disposition)), + ('Content-Type', str(content_type)), + ('Content-Length', str(content_length))] - def get_chunked_archive(tmpfile): - while True: - data = tmpfile.read(16 * 1024) - if not data: - tmpfile.close() - os.unlink(tmpfile.name) - break - yield data - return get_chunked_archive(tmpfile=open(_archive_name, 'rb')) + class _DestroyingFileWrapper(_FileIter): + def close(self): + self.file.close + os.remove(self.file.name) + + request.environ['wsgi.file_wrapper'] = _DestroyingFileWrapper + fapp = FileApp(_archive_name, headers=headers) + return fapp(request.environ, self.start_response) @HasRepoPermissionAnyDecorator('repository.read', 'repository.write', 'repository.admin')
--- a/rhodecode/tests/functional/test_files.py Thu May 17 01:45:05 2012 +0200 +++ b/rhodecode/tests/functional/test_files.py Thu May 17 02:44:45 2012 +0200 @@ -199,13 +199,12 @@ fname=fname)) self.assertEqual(response.status, '200 OK') - self.assertEqual(response.response._headers.items(), - [('Pragma', 'no-cache'), - ('Cache-Control', 'no-cache'), - ('Content-Type', '%s; charset=utf-8' % info[0]), - ('Content-Disposition', 'attachment; filename=%s' % filename), - ] - ) + heads = [ + ('Content-Type', 'text/html; charset=utf-8'), + ('Content-Length', '0'), ('Pragma', 'no-cache'), + ('Cache-Control', 'no-cache') + ] + self.assertEqual(response.response._headers.items(), heads) def test_archival_wrong_ext(self): self.log_user()