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()