[Checkins] SVN: Products.CMFCore/trunk/Products/CMFCore/ - catch DateTimeErrors

Yvo Schubbe y.2011 at wcm-solutions.de
Wed Mar 2 11:47:20 EST 2011


Log message for revision 120681:
  - catch DateTimeErrors

Changed:
  U   Products.CMFCore/trunk/Products/CMFCore/CHANGES.txt
  U   Products.CMFCore/trunk/Products/CMFCore/tests/test_utils.py
  U   Products.CMFCore/trunk/Products/CMFCore/utils.py

-=-
Modified: Products.CMFCore/trunk/Products/CMFCore/CHANGES.txt
===================================================================
--- Products.CMFCore/trunk/Products/CMFCore/CHANGES.txt	2011-03-02 16:41:13 UTC (rev 120680)
+++ Products.CMFCore/trunk/Products/CMFCore/CHANGES.txt	2011-03-02 16:47:19 UTC (rev 120681)
@@ -4,6 +4,9 @@
 2.3.0-alpha (unreleased)
 ------------------------
 
+- utils: Fixed '_OldCacheHeaders' and '_FSCacheHeaders' methods.
+  DateTimeErrors caused by invalid HTTP headers were not caught.
+
 - setup handlers: Added export/import support for member data tool settings.
 
 - MemberDataTool: Fixed tool initialization.

Modified: Products.CMFCore/trunk/Products/CMFCore/tests/test_utils.py
===================================================================
--- Products.CMFCore/trunk/Products/CMFCore/tests/test_utils.py	2011-03-02 16:41:13 UTC (rev 120680)
+++ Products.CMFCore/trunk/Products/CMFCore/tests/test_utils.py	2011-03-02 16:47:19 UTC (rev 120681)
@@ -16,7 +16,11 @@
 import unittest
 import Testing
 
+from Acquisition import Implicit
+from App.Common import rfc1123_date
+from DateTime.DateTime import DateTime
 from Products.CMFCore.tests.base.testcase import SecurityTest
+from Testing.makerequest import makerequest
 
 
 class CoreUtilsTests(unittest.TestCase):
@@ -93,7 +97,66 @@
         self.assertEqual(getContainingPackage('zope.interface.verify'),
                 'zope.interface')
 
+    def test__OldCacheHeaders(self):
+        from Products.CMFCore.utils import _OldCacheHeaders
 
+        _FILE_MOD_TIME = 1000000000
+        _FILE_RFC_DATE = rfc1123_date(_FILE_MOD_TIME)
+
+        class Obj(Implicit):
+            def modified(self):
+                return DateTime(_FILE_MOD_TIME)
+
+        # date < _file_mod_time
+        env = {'HTTP_IF_MODIFIED_SINCE': rfc1123_date(_FILE_MOD_TIME - 1)}
+        obj = makerequest(Obj(), environ=env)
+        _OldCacheHeaders(obj)
+        self.assertEqual(obj.REQUEST.RESPONSE.getHeader('Last-Modified'),
+                         _FILE_RFC_DATE)
+
+        # date > _file_mod_time
+        env = {'HTTP_IF_MODIFIED_SINCE': rfc1123_date(_FILE_MOD_TIME + 1)}
+        obj = makerequest(Obj(), environ=env)
+        _OldCacheHeaders(obj)
+        self.assertEqual(obj.REQUEST.RESPONSE.getHeader('Last-Modified'), None)
+
+        # invalid date
+        env = {'HTTP_IF_MODIFIED_SINCE': 'Fri, 37 Feb 3121 29:64:46'}
+        obj = makerequest(Obj(), environ=env)
+        _OldCacheHeaders(obj)
+        self.assertEqual(obj.REQUEST.RESPONSE.getHeader('Last-Modified'),
+                         _FILE_RFC_DATE)
+
+    def test__FSCacheHeaders(self):
+        from Products.CMFCore.utils import _FSCacheHeaders
+
+        _FILE_MOD_TIME = 1000000000
+        _FILE_RFC_DATE = rfc1123_date(_FILE_MOD_TIME)
+
+        class Obj(Implicit):
+            _file_mod_time = _FILE_MOD_TIME
+
+        # date < _file_mod_time
+        env = {'HTTP_IF_MODIFIED_SINCE': rfc1123_date(_FILE_MOD_TIME - 1)}
+        obj = makerequest(Obj(), environ=env)
+        _FSCacheHeaders(obj)
+        self.assertEqual(obj.REQUEST.RESPONSE.getHeader('Last-Modified'),
+                         _FILE_RFC_DATE)
+
+        # date > _file_mod_time
+        env = {'HTTP_IF_MODIFIED_SINCE': rfc1123_date(_FILE_MOD_TIME + 1)}
+        obj = makerequest(Obj(), environ=env)
+        _FSCacheHeaders(obj)
+        self.assertEqual(obj.REQUEST.RESPONSE.getHeader('Last-Modified'), None)
+
+        # invalid date
+        env = {'HTTP_IF_MODIFIED_SINCE': 'Fri, 37 Feb 3121 29:64:46'}
+        obj = makerequest(Obj(), environ=env)
+        _FSCacheHeaders(obj)
+        self.assertEqual(obj.REQUEST.RESPONSE.getHeader('Last-Modified'),
+                         _FILE_RFC_DATE)
+
+
 class CoreUtilsSecurityTests(SecurityTest):
 
     def _makeSite(self):

Modified: Products.CMFCore/trunk/Products/CMFCore/utils.py
===================================================================
--- Products.CMFCore/trunk/Products/CMFCore/utils.py	2011-03-02 16:41:13 UTC (rev 120680)
+++ Products.CMFCore/trunk/Products/CMFCore/utils.py	2011-03-02 16:47:19 UTC (rev 120681)
@@ -26,16 +26,18 @@
 from AccessControl.SecurityInfo import ClassSecurityInfo
 from AccessControl.SecurityInfo import ModuleSecurityInfo
 from AccessControl.SecurityManagement import getSecurityManager
-from Acquisition.interfaces import IAcquirer
 from Acquisition import aq_get
 from Acquisition import aq_parent
 from Acquisition import Implicit
+from Acquisition.interfaces import IAcquirer
 from App.class_init import InitializeClass
 from App.Common import package_home
+from App.Common import rfc1123_date
 from App.Dialogs import MessageDialog
 from App.ImageFile import ImageFile
 from App.special_dtml import HTMLFile
 from DateTime.DateTime import DateTime
+from DateTime.interfaces import DateTimeError
 from ExtensionClass import Base
 from OFS.misc_ import misc_ as misc_images
 from OFS.misc_ import Misc_ as MiscImage
@@ -43,7 +45,6 @@
 from OFS.PropertyManager import PropertyManager
 from OFS.SimpleItem import SimpleItem
 from thread import allocate_lock
-from webdav.common import rfc1123_date
 from zope.component import getUtility
 from zope.component.interfaces import ComponentLookupError
 from zope.dottedname.resolve import resolve as resolve_dotted_name
@@ -370,8 +371,8 @@
     if call_count != 0:
         return False
 
-    if_modified_since = REQUEST.get_header('If-Modified-Since', None)
-    if_none_match = REQUEST.get_header('If-None-Match', None)
+    if_modified_since = REQUEST.getHeader('If-Modified-Since', None)
+    if_none_match = REQUEST.getHeader('If-None-Match', None)
 
     if if_modified_since is None and if_none_match is None:
         # not a conditional GET
@@ -800,7 +801,7 @@
         return False
 
     RESPONSE = REQUEST.RESPONSE
-    header = REQUEST.get_header('If-Modified-Since', None)
+    header = REQUEST.getHeader('If-Modified-Since', None)
     last_mod = long(obj.modified().timeTime())
 
     if header is not None:
@@ -814,7 +815,7 @@
         try:
             mod_since=DateTime(header)
             mod_since=long(mod_since.timeTime())
-        except TypeError:
+        except (TypeError, DateTimeError):
             mod_since=None
 
         if mod_since is not None:
@@ -834,7 +835,7 @@
         return False
 
     RESPONSE = REQUEST.RESPONSE
-    header = REQUEST.get_header('If-Modified-Since', None)
+    header = REQUEST.getHeader('If-Modified-Since', None)
     last_mod = obj._file_mod_time
 
     if header is not None:
@@ -848,7 +849,7 @@
         try:
             mod_since=DateTime(header)
             mod_since=long(mod_since.timeTime())
-        except TypeError:
+        except (TypeError, DateTimeError):
             mod_since=None
 
         if mod_since is not None:



More information about the checkins mailing list