コード例 #1
0
    def test_cache_is_correctly_ordered(self):
        resp1 = MockRequestsResponse()
        resp2 = MockRequestsResponse()
        resp2.url += 'abc'
        resp3 = MockRequestsResponse()
        resp3.url += 'def'
        cache = httpcache.HTTPCache()
        req = MockRequestsPreparedRequest()

        cache.store(resp1)
        cache.store(resp2)
        cache.store(resp3)
        cache.store(resp2)

        cachelist = list(cache._cache.items())
        assert cachelist[0][1]['response'] is resp1
        assert cachelist[1][1]['response'] is resp3
        assert cachelist[2][1]['response'] is resp2

        cache.handle_304(req)

        cachelist = list(cache._cache.items())
        assert cachelist[0][1]['response'] is resp3
        assert cachelist[1][1]['response'] is resp2
        assert cachelist[2][1]['response'] is resp1
コード例 #2
0
    def test_can_retrieve_responses(self):
        resp = MockRequestsResponse()
        cache = httpcache.HTTPCache()

        cache.store(resp)
        cached_resp = cache.handle_304(resp)

        assert resp is cached_resp
コード例 #3
0
    def test_we_respect_cache_control_max_age(self):
        resp = MockRequestsResponse(headers={'Cache-Control': 'max-age=3600'})
        cache = httpcache.HTTPCache()
        req = MockRequestsPreparedRequest()
        assert cache.store(resp)

        cached_resp = cache.retrieve(req)
        assert cached_resp is resp
コード例 #4
0
    def test_we_dont_cache_some_methods(self):
        resp = MockRequestsResponse()
        cache = httpcache.HTTPCache()

        methods = ('POST', 'PUT', 'DELETE', 'CONNECT', 'PATCH')

        for method in methods:
            resp.request.method = method
            assert not cache.store(resp)
コード例 #5
0
    def test_cache_query_string_if_explicitly_asked(self):
        resp = MockRequestsResponse(headers={'Cache-Control': 'max-age=3600'})
        resp.url += '?a=b'
        cache = httpcache.HTTPCache()

        assert cache.store(resp)

        cached_resp = cache.handle_304(resp)
        assert cached_resp is resp
コード例 #6
0
    def test_can_extract_creation_date_from_response_RFC_850(self):
        resp = MockRequestsResponse(
            headers={'Date': 'Sunday, 06-Nov-94 08:49:37 GMT'})
        cache = httpcache.HTTPCache()
        dt = datetime(1994, 11, 6, 8, 49, 37)

        cache.store(resp)

        assert cache._cache[resp.url]['creation'] == dt
コード例 #7
0
    def test_cache_has_fixed_capacity(self):
        cache = httpcache.HTTPCache(capacity=5)

        for i in range(10):
            resp = MockRequestsResponse()
            resp.url += str(i)
            assert cache.store(resp)

        assert len(cache._cache) == 5
コード例 #8
0
    def test_can_add_if_modified_since_header(self):
        resp = MockRequestsResponse(
            headers={'Date': 'Sun, 06 Nov 1994 08:49:37 GMT'})
        cache = httpcache.HTTPCache()
        req = MockRequestsPreparedRequest()

        cache.store(resp)
        cache.retrieve(req)

        assert req.headers[
            'If-Modified-Since'] == 'Sun, 06 Nov 1994 08:49:37 GMT'
コード例 #9
0
    def test_we_invalidate_for_some_methods(self):
        resp = MockRequestsResponse()
        cache = httpcache.HTTPCache()
        req = MockRequestsPreparedRequest()

        methods = ('POST', 'PUT', 'DELETE', 'CONNECT', 'PATCH')

        for method in methods:
            assert cache.store(resp)
            req.method = method
            assert cache.retrieve(req) is None
            assert len(cache._cache) == 0
コード例 #10
0
    def test_we_respect_the_expires_header(self):
        resp = MockRequestsResponse(
            headers={
                'Date': 'Sun, 06 Nov 1994 08:49:37 GMT',
                'Expires': 'Sun, 06 Nov 2034 08:49:37 GMT'
            })
        cache = httpcache.HTTPCache()
        req = MockRequestsPreparedRequest()

        cache.store(resp)
        cached_resp = cache.retrieve(req)

        assert cached_resp is resp
コード例 #11
0
    def test_expires_headers_invalidate(self):
        resp1 = MockRequestsResponse(
            headers={
                'Date': 'Sun, 06 Nov 1994 08:49:37 GMT',
                'Expires': 'Sun, 06 Nov 1994 08:49:37 GMT'
            })
        resp2 = MockRequestsResponse(
            headers={
                'Date': 'Sun, 06 Nov 1994 08:49:37 GMT',
                'Expires': 'Sun, 06 Nov 1994 08:00:00 GMT'
            })
        cache = httpcache.HTTPCache()

        assert not cache.store(resp1)
        assert not cache.store(resp2)
コード例 #12
0
    def test_cache_will_delete_expiry_caches_if_necessary(self):
        cache = httpcache.HTTPCache(capacity=5)
        test_resp = MockRequestsResponse(
            headers={'Cache-Control': 'max-age=3600'})
        assert cache.store(test_resp)

        for i in range(5):
            resp = MockRequestsResponse(
                headers={'Cache-Control': 'max-age=3600'})
            resp.url += str(i)
            assert cache.store(resp)

        assert len(cache._cache) == 5
        assert test_resp not in [
            cache._cache[key] for key in list(cache._cache.keys())
        ]
コード例 #13
0
    def test_cache_preferentially_deletes_speculative_caching(self):
        cache = httpcache.HTTPCache(capacity=5)

        for i in range(4):
            resp = MockRequestsResponse(
                headers={'Cache-Control': 'max-age=3600'})
            resp.url += str(i)
            assert cache.store(resp)

        test_resp = MockRequestsResponse()
        test_resp.url += 'other'
        assert cache.store(test_resp)

        resp = MockRequestsResponse(headers={'Cache-Control': 'max-age=3600'})
        assert cache.store(resp)

        assert len(cache._cache) == 5
        assert test_resp not in [
            cache._cache[key] for key in list(cache._cache.keys())
        ]
コード例 #14
0
    def test_expiry_of_expires(self):
        resp = MockRequestsResponse(
            headers={
                'Date': 'Sun, 06 Nov 1994 08:49:37 GMT',
                'Expires': 'Sun, 04 Nov 2012 08:49:37 GMT'
            })
        cache = httpcache.HTTPCache()
        req = MockRequestsPreparedRequest()
        earlier = timedelta(seconds=-60)
        much_earlier = timedelta(days=-1)

        cache._cache[resp.url] = {
            'response': resp,
            'creation': datetime.utcnow() + much_earlier,
            'expiry': datetime.utcnow() + earlier
        }

        cached_resp = cache.retrieve(req)

        assert cached_resp is None
        assert len(cache._cache) == 0
コード例 #15
0
ファイル: oldicious.py プロジェクト: tian2992/shoebot
def get_url_contents(url):
    try:
        import httpcache
        return httpcache.HTTPCache(url).content()
    except ImportError:
        return urllib.urlopen(url).read()
コード例 #16
0
    def test_we_respect_no_store(self):
        resp = MockRequestsResponse(headers={'Cache-Control': 'no-store'})
        cache = httpcache.HTTPCache()

        assert not cache.store(resp)
コード例 #17
0
    def test_we_respect_max_age_zero(self):
        resp = MockRequestsResponse(headers={'Cache-Control': 'max-age=0'})
        cache = httpcache.HTTPCache()

        assert not cache.store(resp)
コード例 #18
0
    def test_can_store_responses(self):
        resp = MockRequestsResponse()
        cache = httpcache.HTTPCache()

        rc = cache.store(resp)
        assert rc
コード例 #19
0
    def test_do_not_cache_query_strings(self):
        resp = MockRequestsResponse()
        resp.url += '?a=b'
        cache = httpcache.HTTPCache()

        assert not cache.store(resp)
コード例 #20
0
    def test_dont_store_non_200_responses(self):
        resp = MockRequestsResponse(status_code=403)
        cache = httpcache.HTTPCache()

        rc = cache.store(resp)
        assert not rc