[z3-checkins] r39930 - in z3/deliverance/trunk: . deliverance

ltucker at codespeak.net ltucker at codespeak.net
Mon Mar 5 06:25:39 CET 2007


Author: ltucker
Date: Mon Mar  5 06:25:37 2007
New Revision: 39930

Modified:
   z3/deliverance/trunk/deliverance/resource_fetcher.py
   z3/deliverance/trunk/deliverance/wsgimiddleware.py
   z3/deliverance/trunk/setup.py
Log:
handle file urls again

Modified: z3/deliverance/trunk/deliverance/resource_fetcher.py
==============================================================================
--- z3/deliverance/trunk/deliverance/resource_fetcher.py	(original)
+++ z3/deliverance/trunk/deliverance/resource_fetcher.py	Mon Mar  5 06:25:37 2007
@@ -4,6 +4,7 @@
 from paste.proxy import TransparentProxy 
 from paste.request import construct_url
 from paste.response import header_value
+from paste.fileapp import FileApp
 import urlparse
 from deliverance.utils import DeliveranceError
 
@@ -75,6 +76,54 @@
                    loc))
         return body
 
+class FileResourceFetcher(object):
+    def __init__(self, environ, uri, headers_only=False):
+        self.environ = environ.copy()
+        self.uri = uri
+
+        uri_parts = urlparse.urlparse(self.uri)
+        self.environ['PATH_INFO'] = uri_parts[2]
+        self.environ['SCRIPT_INFO'] = '' 
+        self.environ['wsgi.scheme'] = 'file'
+        if len(uri_parts[4]) > 0: 
+            self.environ['QUERY_STRING'] = uri_parts[4] + '&notheme'
+        else: 
+            self.environ['QUERY_STRING'] = 'notheme'
+
+        if headers_only:
+            self.environ['REQUEST_METHOD'] = 'HEAD'
+        else:
+            self.environ['REQUEST_METHOD'] = 'GET'
+
+        self.environ['CONTENT_LENGTH'] = '0'
+        self.environ['wsgi.input'] = StringIO('')
+        self.environ['CONTENT_TYPE'] = '' 
+
+        if 'HTTP_ACCEPT_ENCODING' in self.environ:
+            del self.environ['HTTP_ACCEPT_ENCODING']
+
+    def wsgi_get(self):
+        path = urlparse.urlparse(self.uri)[2]
+        file_app = FileApp(path)
+
+        return intercept_output(self.environ, file_app)
+        
+
+    def get(self):
+        path_info = self.environ['PATH_INFO']
+        status, headers, body = self.wsgi_get()
+
+        if not status.startswith('200'):
+            loc = header_value(headers, 'location')
+            if loc:
+                loc = ' location=%r' % loc
+            else:
+                loc = ''
+            raise DeliveranceError(
+                "Request for file at %s (%r) failed with status code %r%s"
+                % (construct_url(self.environ), path_info, status,
+                   loc))
+        return body
 
 class ExternalResourceFetcher(object): 
     def __init__(self, uri, headers_only=False): 

Modified: z3/deliverance/trunk/deliverance/wsgimiddleware.py
==============================================================================
--- z3/deliverance/trunk/deliverance/wsgimiddleware.py	(original)
+++ z3/deliverance/trunk/deliverance/wsgimiddleware.py	Mon Mar  5 06:25:37 2007
@@ -15,7 +15,7 @@
 from htmlserialize import tostring
 from deliverance.utils import DeliveranceError
 from deliverance.utils import DELIVERANCE_ERROR_PAGE
-from deliverance.resource_fetcher import InternalResourceFetcher, ExternalResourceFetcher
+from deliverance.resource_fetcher import InternalResourceFetcher, FileResourceFetcher, ExternalResourceFetcher
 from deliverance import cache_utils
 import sys 
 import datetime
@@ -359,7 +359,10 @@
         internalBaseURL = environ.get(DELIVERANCE_BASE_URL,None)
         uri = urlparse.urljoin(internalBaseURL, uri)        
 
-        if  internalBaseURL and uri.startswith(internalBaseURL):
+        if urlparse.urlparse(uri)[0] == 'file':
+            return FileResourceFetcher(environ, uri)
+
+        elif  internalBaseURL and uri.startswith(internalBaseURL):
             return InternalResourceFetcher(environ, uri[len(internalBaseURL):],
                                            self.app)
         else:

Modified: z3/deliverance/trunk/setup.py
==============================================================================
--- z3/deliverance/trunk/setup.py	(original)
+++ z3/deliverance/trunk/setup.py	Mon Mar  5 06:25:37 2007
@@ -18,7 +18,7 @@
       packages=find_packages(exclude=[]),
       zip_safe=False,
       install_requires=[
-        'lxml',
+        'lxml==1.2',
         'Paste',
 	'FormEncode',
 	'elementtree',


More information about the z3-checkins mailing list