[z3-checkins] r37778 - z3/deliverance/branches/cache_aware/deliverance

ltucker at codespeak.net ltucker at codespeak.net
Fri Feb 2 00:20:23 CET 2007


Author: ltucker
Date: Fri Feb  2 00:20:20 2007
New Revision: 37778

Modified:
   z3/deliverance/branches/cache_aware/deliverance/cache_utils.py
Log:
treats headers with only Expires set as cache-control: max-age headers

Modified: z3/deliverance/branches/cache_aware/deliverance/cache_utils.py
==============================================================================
--- z3/deliverance/branches/cache_aware/deliverance/cache_utils.py	(original)
+++ z3/deliverance/branches/cache_aware/deliverance/cache_utils.py	Fri Feb  2 00:20:20 2007
@@ -1,5 +1,7 @@
 import re
 from paste.response import header_value, replace_header
+from paste.httpheaders import EXPIRES 
+from time import time as now
 from sets import Set
 
 
@@ -23,50 +25,77 @@
     (a map of urls to wsgi response triples) 
     """
 
-    cache_info = {}
+    headers_map = {}
     for uri, response in response_info.items(): 
-        cache_info[uri] = response[1]
-
-    cache_control = merge_cache_control(cache_info.values())
-    if cache_control:         
-        replace_header(new_headers, 'cache-control', cache_control)
+        headers_map[uri] = response[1]
+        
+    cache_control_map = merge_cache_control(headers_map.values(), upgrade_expires=True)
+    if len(cache_control_map):         
+        replace_header(new_headers, 'cache-control', 
+                       flatten_directive_map(cache_control_map))
+        # provide an Expires header if there is a cache-control max-age 
+        if 'max-age' in cache_control_map: 
+            expire_delta = int(new_cache_ctl['max-age'])
+            EXPIRES.update(new_headers, delta=expire_delta)
 
-    etag = merge_etags_from_headers(cache_info)
+    etag = merge_etags_from_headers(headers_map)
     if etag is not None: 
         replace_header(new_headers, 'etag', etag )
 
-    vary = merge_vary_from_headers(cache_info)
+    vary = merge_vary_from_headers(headers_map)
     if vary is not None: 
         replace_header(new_headers, 'vary', vary)
 
-    # XXX Expires 
-
 
 
-
-def merge_cache_control(header_sets): 
+def merge_cache_control(header_sets, upgrade_expires=False): 
     """
     computes a value for the cache-control header based on the 
     values of the cache-control headers found in the list of 
-    wsgi-style response header lists. 
+    wsgi-style response header lists. returns a map of 
+    cache-control directive names to values. use 
+    flatten_directive_map to compute value suitable for 
+    the cache-control header. 
+    
+    if upgrade_expires is True, if there is a header set with 
+    an Expires header, but no cache-control header, it is treated as a 
+    cache-control: public, max-age: <expire difference from now>  
 
     >>> headerses = []
     >>> headerses.append([ ('cache-control', "public, max-age = 10") ])
     >>> headerses.append([ ('cache-control', "public, max-age = 5") ])
     >>> headerses.append([ ('cache-control', "public, max-age = 2") ])
-    >>> merge_cache_control(headerses)
+    >>> flatten_directive_map(merge_cache_control(headerses))
     'public, max-age = 2'
 
     >>> headerses = []
     >>> headerses.append([ ('cache-control', "public, max-age = 10") ])
     >>> headerses.append([ ('cache-control', "private, max-age = 5") ])
     >>> headerses.append([ ('cache-control', "public, max-age = 2") ])
-    >>> merge_cache_control(headerses)
+    >>> flatten_directive_map(merge_cache_control(headerses))
     'private, max-age = 2'
 
-    """
+    >>> headerses = [[],[('cache-control', "public, max-age = 100")]]
+    >>> from paste.httpheaders import EXPIRES
+    >>> EXPIRES.update(headerses[0], time=( int(now()) + 20))
+    >>> flatten_directive_map(merge_cache_control(headerses, upgrade_expires=True))
+    'public, max-age = 20'
     
+
+    """    
+
     cache_ctls = [parse_cache_directives(header_value(x,'cache-control')) for x in header_sets]
+
+    if upgrade_expires: 
+        # if there is a header set with no cache-control, but an Expires, 
+        # upgrade it to a cache-control: max-age = <expires offset>, public
+        for i,cc in enumerate(cache_ctls):
+            if len(cc) == 0:
+                expire_val = header_value(header_sets[i],'expires')
+                if expire_val is not None:
+                    expire_secs = int(EXPIRES.parse(expire_val) - int(now()))
+                    cc['public'] = None
+                    cc['max-age'] = expire_secs
         
     # apply cache-control merging policies 
     new_cache_ctl = dict() 
@@ -81,7 +110,7 @@
     merge_minimum('max-age', new_cache_ctl, cache_ctls)
     merge_minimum('smax-age', new_cache_ctl, cache_ctls)
 
-    return flatten_directive_map(new_cache_ctl)
+    return new_cache_ctl 
 
     
 def merge_etags_from_headers(headers_map): 
@@ -120,7 +149,6 @@
     else: 
         return None
 
-    
 def parse_merged_etag(composite_tag): 
     """
     given a composite etag computed by merge_etags, 


More information about the z3-checkins mailing list