'Algorithm for caching requests.
This assumes a requests Response object.'

def cache_response(self, request, response, body=None):

    cacheable_status_codes = [200, 203, 300, 301]
    if (response.status not in cacheable_status_codes):
        logger.debug('Status    code    %s    not    in    %s', response.status, cacheable_status_codes)
        return
    response_headers = CaseInsensitiveDict(response.headers)
    if ((body is not None) and ('content-length' in response_headers) and response_headers['content-length'].isdigit() and (int(response_headers['content-length']) != len(body))):
        return
    cc_req = self.parse_cache_control(request.headers)
    cc = self.parse_cache_control(response_headers)
    cache_url = self.cache_url(request.url)
    logger.debug('Updating    cache    with    response    from    "%s"', cache_url)
    no_store = False
    if cc.get('no-store'):
        no_store = True
        logger.debug('Response    header    has    "no-store"')
    if cc_req.get('no-store'):
        no_store = True
        logger.debug('Request    header    has    "no-store"')
    if (no_store and self.cache.get(cache_url)):
        logger.debug('Purging    existing    cache    entry    to    honor    "no-store"')
        self.cache.delete(cache_url)
    if (self.cache_etags and ('etag' in response_headers)):
        logger.debug('Caching    due    to    etag')
        self.cache.set(cache_url, self.serializer.dumps(request, response, body=body))
    elif (response.status == 301):
        logger.debug('Caching    permanant    redirect')
        self.cache.set(cache_url, self.serializer.dumps(request, response))
    elif ('date' in response_headers):
        if (cc and cc.get('max-age')):
            if (int(cc['max-age']) > 0):
                logger.debug('Caching    b/c    date    exists    and    max-age    >    0')
                self.cache.set(cache_url, self.serializer.dumps(request, response, body=body))
        elif ('expires' in response_headers):
            if response_headers['expires']:
                logger.debug('Caching    b/c    of    expires    header')
                self.cache.set(cache_url, self.serializer.dumps(request, response, body=body))
