From 9b87f181bf1c9f1fd825887cb574ca50181441bf Mon Sep 17 00:00:00 2001 From: Nikhil Benesch Date: Fri, 29 May 2015 16:15:19 -0400 Subject: [PATCH 1/2] add failing test cases for StaticFile IF_MODIFIED_SINCE handling --- demo/demoproject/storage/tests.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/demo/demoproject/storage/tests.py b/demo/demoproject/storage/tests.py index 1924f48..2213f6b 100644 --- a/demo/demoproject/storage/tests.py +++ b/demo/demoproject/storage/tests.py @@ -2,6 +2,7 @@ import unittest from django.core.files.base import ContentFile from django.core.urlresolvers import reverse +from django.http.response import HttpResponseNotModified import django.test from django_downloadview import assert_download_response, temporary_media_root @@ -31,6 +32,30 @@ class StaticPathTestCase(django.test.TestCase): basename='1.txt', mime_type='text/plain') + @temporary_media_root() + def test_not_modified_download_response(self): + """'storage:static_path' sends not modified response if unmodified""" + setup_file('1.txt') + url = reverse('storage:static_path', kwargs={'path': '1.txt'}) + response = self.client.get( + url, + HTTP_IF_MODIFIED_SINCE='Sat, 29 Oct 2025 19:43:31 GMT') + self.assertTrue(isinstance(response, HttpResponseNotModified)) + + @temporary_media_root() + def test_modified_since_download_response(self): + """'storage:static_path' streams file if modified""" + setup_file('1.txt') + url = reverse('storage:static_path', kwargs={'path': '1.txt'}) + response = self.client.get( + url, + HTTP_IF_MODIFIED_SINCE='Sat, 29 Oct 1980 19:43:31 GMT') + assert_download_response(self, + response, + content=file_content, + basename='1.txt', + mime_type='text/plain') + class DynamicPathIntegrationTestCase(django.test.TestCase): """Integration tests around ``storage:dynamic_path`` URL.""" From e685f9909d5c65eccc46fe856e5ccb663d725f82 Mon Sep 17 00:00:00 2001 From: Nikhil Benesch Date: Fri, 29 May 2015 16:16:05 -0400 Subject: [PATCH 2/2] properly compute modified since with StaticFile wrapper --- django_downloadview/views/base.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/django_downloadview/views/base.py b/django_downloadview/views/base.py index a8b9c82..df9c128 100644 --- a/django_downloadview/views/base.py +++ b/django_downloadview/views/base.py @@ -1,6 +1,8 @@ # -*- coding: utf-8 -*- """Base material for download views: :class:`DownloadMixin` and :class:`BaseDownloadView`""" +import datetime + from django.http import HttpResponseNotModified, Http404 from django.views.generic.base import View from django.views.static import was_modified_since @@ -116,7 +118,10 @@ class DownloadMixin(object): except (AttributeError, NotImplementedError): return True else: - return was_modified_since(since, modification_time, size) + epoch_delta = modification_time - datetime.datetime(1970, 1, 1) + return was_modified_since(since, + epoch_delta.total_seconds(), + size) def not_modified_response(self, *response_args, **response_kwargs): """Return :class:`django.http.HttpResponseNotModified` instance."""