From e202d210b618cba29d2c300b17a2ffb8e003fd14 Mon Sep 17 00:00:00 2001 From: Joe Gregorio Date: Thu, 16 Jul 2009 14:57:52 -0400 Subject: Fixed issue #12 - Cache-Control: only-if-cached incorrectly does request if item not in cache --- python3/httplib2/__init__.py | 8 +++++++- python3/httplib2test.py | 22 ++++++++++++++++++---- 2 files changed, 25 insertions(+), 5 deletions(-) (limited to 'python3') diff --git a/python3/httplib2/__init__.py b/python3/httplib2/__init__.py index d660796..389c3fe 100755 --- a/python3/httplib2/__init__.py +++ b/python3/httplib2/__init__.py @@ -1074,7 +1074,13 @@ a string that contains the response entity body. self.cache.delete(cachekey) content = new_content else: - (response, content) = self._request(conn, authority, uri, request_uri, method, body, headers, redirections, cachekey) + cc = _parse_cache_control(headers) + if 'only-if-cached'in cc: + info['status'] = '504' + response = Response(info) + content = b"" + else: + (response, content) = self._request(conn, authority, uri, request_uri, method, body, headers, redirections, cachekey) except Exception as e: if self.force_exception_to_status_code: if isinstance(e, HttpLib2ErrorWithResponse): diff --git a/python3/httplib2test.py b/python3/httplib2test.py index 5b91164..6db6756 100755 --- a/python3/httplib2test.py +++ b/python3/httplib2test.py @@ -203,13 +203,27 @@ class HttpTest(unittest.TestCase): self.assertEqual(response.status, 200) self.assertEqual(response.previous, None) + def testGetOnlyIfCachedCacheHit(self): + # Test that can do a GET with cache and 'only-if-cached' + uri = urllib.parse.urljoin(base, "304/test_etag.txt") + (response, content) = self.http.request(uri, "GET") + (response, content) = self.http.request(uri, "GET", headers={'cache-control': 'only-if-cached'}) + self.assertEqual(response.fromcache, True) + self.assertEqual(response.status, 200) + + def testGetOnlyIfCachedCacheMissCache(self): + # Test that can do a GET with cache and 'only-if-cached' + uri = urllib.parse.urljoin(base, "304/test_etag.txt") + (response, content) = self.http.request(uri, "GET", headers={'cache-control': 'only-if-cached'}) + self.assertEqual(response.fromcache, False) + self.assertEqual(response.status, 504) + def testGetOnlyIfCachedCacheMiss(self): # Test that can do a GET with no cache with 'only-if-cached' - http = httplib2.Http() uri = urllib.parse.urljoin(base, "304/test_etag.txt") - (response, content) = http.request(uri, "GET", headers={'cache-control': 'only-if-cached'}) + (response, content) = self.http.request(uri, "GET", headers={'cache-control': 'only-if-cached'}) self.assertEqual(response.fromcache, False) - self.assertEqual(response.status, 200) + self.assertEqual(response.status, 504) def testGetOnlyIfCachedNoCacheAtAll(self): # Test that can do a GET with no cache with 'only-if-cached' @@ -220,7 +234,7 @@ class HttpTest(unittest.TestCase): uri = urllib.parse.urljoin(base, "304/test_etag.txt") (response, content) = http.request(uri, "GET", headers={'cache-control': 'only-if-cached'}) self.assertEqual(response.fromcache, False) - self.assertEqual(response.status, 200) + self.assertEqual(response.status, 504) def testUserAgent(self): # Test that we provide a default user-agent -- cgit v1.2.1