diff options
author | Jenkins <jenkins@review.openstack.org> | 2014-03-20 15:20:56 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2014-03-20 15:20:56 +0000 |
commit | bb0aac6656ba4d718869a87c9c9820e2856036ce (patch) | |
tree | 7dbfed638b51530da56f2517975fbc082792d2a5 | |
parent | 04de98691f0239e75348bb6bbdcae3b028efa6d9 (diff) | |
parent | a69789fa0650f2975508b6f8f572f8bc8ffdb078 (diff) | |
download | swift-bb0aac6656ba4d718869a87c9c9820e2856036ce.tar.gz |
Merge "Allow pre-1970 dates in If-[Un]Modified-Since"
-rw-r--r-- | swift/common/swob.py | 5 | ||||
-rw-r--r-- | swift/obj/server.py | 15 | ||||
-rw-r--r-- | test/unit/common/test_swob.py | 12 | ||||
-rwxr-xr-x | test/unit/obj/test_server.py | 17 |
4 files changed, 24 insertions, 25 deletions
diff --git a/swift/common/swob.py b/swift/common/swob.py index ba3b54bb7..638086ea0 100644 --- a/swift/common/swob.py +++ b/swift/common/swob.py @@ -138,12 +138,9 @@ def _datetime_property(header): if value is not None: try: parts = parsedate(self.headers[header])[:7] - date = datetime(*(parts + (UTC,))) + return datetime(*(parts + (UTC,))) except Exception: return None - if date.year < 1970: - raise ValueError('Somehow an invalid year') - return date def setter(self, value): if isinstance(value, (float, int, long)): diff --git a/swift/obj/server.py b/swift/obj/server.py index 3436b632c..a4d8de7c9 100644 --- a/swift/obj/server.py +++ b/swift/obj/server.py @@ -481,21 +481,16 @@ class ObjectController(object): obj_size = int(metadata['Content-Length']) file_x_ts = metadata['X-Timestamp'] file_x_ts_flt = float(file_x_ts) - try: - if_unmodified_since = request.if_unmodified_since - except (OverflowError, ValueError): - # catches timestamps before the epoch - return HTTPPreconditionFailed(request=request) file_x_ts_utc = datetime.fromtimestamp(file_x_ts_flt, UTC) + + if_unmodified_since = request.if_unmodified_since if if_unmodified_since and file_x_ts_utc > if_unmodified_since: return HTTPPreconditionFailed(request=request) - try: - if_modified_since = request.if_modified_since - except (OverflowError, ValueError): - # catches timestamps before the epoch - return HTTPPreconditionFailed(request=request) + + if_modified_since = request.if_modified_since if if_modified_since and file_x_ts_utc <= if_modified_since: return HTTPNotModified(request=request) + keep_cache = (self.keep_cache_private or ('X-Auth-Token' not in request.headers and 'X-Storage-Token' not in request.headers)) diff --git a/test/unit/common/test_swob.py b/test/unit/common/test_swob.py index a2e538704..7cc5439e9 100644 --- a/test/unit/common/test_swob.py +++ b/test/unit/common/test_swob.py @@ -18,6 +18,7 @@ import unittest import datetime import re +import time from StringIO import StringIO from urllib import quote @@ -644,13 +645,18 @@ class TestRequest(unittest.TestCase): self.assertEquals(req.headers['If-Unmodified-Since'], 'something') self.assertEquals(req.if_unmodified_since, None) - req.if_unmodified_since = -1 - self.assertRaises(ValueError, lambda: req.if_unmodified_since) - self.assert_('If-Unmodified-Since' in req.headers) req.if_unmodified_since = None self.assert_('If-Unmodified-Since' not in req.headers) + too_big_date_list = list(datetime.datetime.max.timetuple()) + too_big_date_list[0] += 1 # bump up the year + too_big_date = time.strftime( + "%a, %d %b %Y %H:%M:%S UTC", time.struct_time(too_big_date_list)) + + req.if_unmodified_since = too_big_date + self.assertEqual(req.if_unmodified_since, None) + def test_bad_range(self): req = swift.common.swob.Request.blank('/hi/there', body='hi') req.range = 'bad range' diff --git a/test/unit/obj/test_server.py b/test/unit/obj/test_server.py index 59555073a..749c9705e 100755 --- a/test/unit/obj/test_server.py +++ b/test/unit/obj/test_server.py @@ -17,6 +17,7 @@ """Tests for swift.obj.server""" import cPickle as pickle +import datetime import operator import os import mock @@ -24,7 +25,7 @@ import unittest import math from shutil import rmtree from StringIO import StringIO -from time import gmtime, strftime, time +from time import gmtime, strftime, time, struct_time from tempfile import mkdtemp from hashlib import md5 @@ -1911,16 +1912,16 @@ class TestObjectController(unittest.TestCase): headers={'If-Modified-Since': 'Not a valid date'}) resp = req.get_response(self.object_controller) self.assertEquals(resp.status_int, 200) + + too_big_date_list = list(datetime.datetime.max.timetuple()) + too_big_date_list[0] += 1 # bump up the year + too_big_date = strftime( + "%a, %d %b %Y %H:%M:%S UTC", struct_time(too_big_date_list)) req = Request.blank( '/sda1/p/a/c/o', environ={'REQUEST_METHOD': 'GET'}, - headers={'If-Unmodified-Since': 'Sat, 29 Oct 1000 19:43:31 GMT'}) - resp = req.get_response(self.object_controller) - self.assertEquals(resp.status_int, 412) - req = Request.blank( - '/sda1/p/a/c/o', environ={'REQUEST_METHOD': 'GET'}, - headers={'If-Modified-Since': 'Sat, 29 Oct 1000 19:43:31 GMT'}) + headers={'If-Unmodified-Since': too_big_date}) resp = req.get_response(self.object_controller) - self.assertEquals(resp.status_int, 412) + self.assertEquals(resp.status_int, 200) def test_content_encoding(self): req = Request.blank( |