[Checkins] SVN: hurry.resource/branches/janjaapdriessen-resource-publisher/src/hurry/resource/publisher.py Publisher only sets cache control header on successful responses. Hidden files are not served.

Jan-Jaap Driessen jdriessen at thehealthagency.com
Tue Nov 16 10:07:25 EST 2010


Log message for revision 118426:
  Publisher only sets cache control header on successful responses. Hidden files are not served.

Changed:
  U   hurry.resource/branches/janjaapdriessen-resource-publisher/src/hurry/resource/publisher.py

-=-
Modified: hurry.resource/branches/janjaapdriessen-resource-publisher/src/hurry/resource/publisher.py
===================================================================
--- hurry.resource/branches/janjaapdriessen-resource-publisher/src/hurry/resource/publisher.py	2010-11-16 08:45:06 UTC (rev 118425)
+++ hurry.resource/branches/janjaapdriessen-resource-publisher/src/hurry/resource/publisher.py	2010-11-16 15:07:24 UTC (rev 118426)
@@ -4,11 +4,22 @@
 
 import hurry.resource
 
+
+class FilterHiddenDirectoryApp(DirectoryApp):
+    def __call__(self, environ, start_response):
+        path_info = environ['PATH_INFO']
+        for segment in path_info.split('/'):
+            if segment.startswith('.'):
+                return HTTPNotFound()(environ, start_response)
+        return DirectoryApp.__call__(self, environ, start_response)
+
+
 class Publisher(object):
     def __init__(self):
-        self.dirapps = {}
+        self.directory_apps = {}
         for library in hurry.resource.libraries():
-            self.dirapps[library.name] = DirectoryApp(library.path)
+            app = FilterHiddenDirectoryApp(library.path)
+            self.directory_apps[library.name] = app
 
     def __call__(self, environ, start_response):
         # When configured through Paste#urlmap, the WSGI environ['PATH_INFO']
@@ -16,15 +27,16 @@
 
         library_name = path_info_pop(environ)
         try:
-            dirapp = self.dirapps[library_name]
+            directory_app = self.directory_apps[library_name]
         except KeyError:
             return HTTPNotFound()(environ, start_response)
 
         def cache_header_start_response(status, headers, exc_info=None):
-            # XXX Don't set the cache control for 404's and friends.
-            expires = CACHE_CONTROL.apply(headers,
-                                          max_age=10*CACHE_CONTROL.ONE_YEAR)
-            EXPIRES.update(headers, delta=expires)
+            # Only set the cache control for succesful requests (200, 206).
+            if status.startswith('20'):
+                expires = CACHE_CONTROL.apply(
+                    headers, max_age=10*CACHE_CONTROL.ONE_YEAR)
+                EXPIRES.update(headers, delta=expires)
             return start_response(status, headers, exc_info)
 
         response = start_response
@@ -35,7 +47,7 @@
             path_info_pop(environ)
             response = cache_header_start_response
 
-        return dirapp(environ, response)
+        return directory_app(environ, response)
 
 
 def make_publisher(global_conf):



More information about the checkins mailing list