[Checkins] SVN: z3c.extfile/trunk/ see CHANGES.txt

Bernd Dorn bernd.dorn at lovelysystems.com
Sat Jan 19 09:52:29 EST 2008


Log message for revision 82950:
  see CHANGES.txt

Changed:
  U   z3c.extfile/trunk/CHANGES.txt
  U   z3c.extfile/trunk/src/z3c/extfile/filter.py
  U   z3c.extfile/trunk/src/z3c/extfile/filter.txt

-=-
Modified: z3c.extfile/trunk/CHANGES.txt
===================================================================
--- z3c.extfile/trunk/CHANGES.txt	2008-01-19 12:06:51 UTC (rev 82949)
+++ z3c.extfile/trunk/CHANGES.txt	2008-01-19 14:52:28 UTC (rev 82950)
@@ -5,6 +5,9 @@
 After
 =====
 
+- renamed environ variables to make it work with a server that sets
+  the HTTP_ prefix
+
 - set content-type and length in wsgi filter if info is present when
   delivering files
 

Modified: z3c.extfile/trunk/src/z3c/extfile/filter.py
===================================================================
--- z3c.extfile/trunk/src/z3c/extfile/filter.py	2008-01-19 12:06:51 UTC (rev 82949)
+++ z3c.extfile/trunk/src/z3c/extfile/filter.py	2008-01-19 14:52:28 UTC (rev 82950)
@@ -22,15 +22,15 @@
 
     def __call__(self, env, start_response):
         method = env.get('REQUEST_METHOD')
-        if env.get('X-EXTFILE-HANDLE'):
+        if env.get('HTTP_X_EXTFILE_HANDLE'):
             if method=='POST' and \
                    env.get('CONTENT_TYPE','').startswith('multipart/form-data;'):
                 fp = env['wsgi.input']
                 out = StringIO()
                 proc = processor.Processor(
                     self.hd,
-                    contentInfo=env.has_key('X-EXTFILE-INFO'),
-                    allowedTypes=env.get('X-EXTFILE-TYPES'),
+                    contentInfo=env.has_key('HTTP_X_EXTFILE_INFO'),
+                    allowedTypes=env.get('HTTP_X_EXTFILE_TYPES'),
                     )
                 cl = env.get('CONTENT_LENGTH')
                 if not cl:
@@ -50,8 +50,29 @@
                 return resp(env, start_response)
         return self.app(env, start_response)
 
+def getInfo(s):
 
+    """takes a z3c.extfile info string and returns a (digest,
+    contentType, contentLength) tuple. If the parsing fails digest is
+    None"""
 
+    parts = s.split(':')
+    contentType = contentLength = None
+    if len(parts)==2:
+        digest = parts[1]
+    elif len(parts)==4:
+        digest, contentType, contentLength = parts[1:]
+    else:
+        digest = None
+    if len(digest)!=40:
+        digest = None
+    if contentLength is not None:
+        try:
+            contentLength=int(contentLength)
+        except ValueError:
+            contentLength = None
+    return (digest, contentType, contentLength)
+
 class FileResponse(object):
 
     def __init__(self, app, hd):
@@ -83,13 +104,8 @@
         body = "".join(self.response)
         if not body.startswith('z3c.extfile.digest:'):
             return self._orgStart()
-        parts = body.split(':')
-        contentType = contentLength = None
-        if len(parts)==2:
-            digest = parts[1]
-        elif len(parts)==4:
-            digest, contentType, contentLength = parts[1:]
-        else:
+        digest, contentType, contentLength = getInfo(body)
+        if digest is None:
             return self._orgStart()
         try:
             f = self.hd.open(digest)
@@ -102,7 +118,7 @@
         if contentType:
             headers_out['content-type'] = contentType
         if contentLength:
-            headers_out['content-length'] = contentLength
+            headers_out['content-length'] = str(contentLength)
         else:
             headers_out['content-length'] = str(len(f))
         headers_out = headers_out.items()

Modified: z3c.extfile/trunk/src/z3c/extfile/filter.txt
===================================================================
--- z3c.extfile/trunk/src/z3c/extfile/filter.txt	2008-01-19 12:06:51 UTC (rev 82949)
+++ z3c.extfile/trunk/src/z3c/extfile/filter.txt	2008-01-19 14:52:28 UTC (rev 82950)
@@ -43,7 +43,7 @@
 
 So let us set the header, this should be done by the frontend server normally.
 
-    >>> env = {'X-EXTFILE-HANDLE':'on'}
+    >>> env = {'HTTP_X_EXTFILE_HANDLE':'on'}
     >>> print app.post('/', params=dict(x=1), extra_environ=env,
     ...         upload_files=(('myfile',testFile('test.png')),),).body
     ------------a_...$
@@ -61,7 +61,7 @@
 When enabled the upload filter adds the content type and length to the
 uplaad data. We can enable this by setting an additional header.
 
-    >>> env['X-EXTFILE-INFO'] = 'on'
+    >>> env['HTTP_X_EXTFILE_INFO'] = 'on'
     >>> print app.post('/', params=dict(x=1), extra_environ=env,
     ...         upload_files=(('myfile',testFile('test.png')),),).body
     ---...
@@ -72,7 +72,7 @@
 We can also restrict types by setting a regex in a header. If the type
 does not match a 400 is raised.
 
-    >>> env['X-EXTFILE-TYPES'] = 'text/html'
+    >>> env['HTTP_X_EXTFILE_TYPES'] = 'text/html'
     >>> print app.post('/', params=dict(x=1), extra_environ=env,
     ...         upload_files=(('myfile',testFile('test.png')),),).body
     Traceback (most recent call last):
@@ -90,7 +90,7 @@
 
 For example we can allow only jpegs and pngs to be uploaded.
 
-    >>> env['X-EXTFILE-TYPES'] = 'image/((jpe?g)|(png))'
+    >>> env['HTTP_X_EXTFILE_TYPES'] = 'image/((jpe?g)|(png))'
     >>> print app.post('/', extra_environ=env,
     ...         upload_files=(('myfile',testFile('test.png')),),).status
     200
@@ -100,7 +100,7 @@
     ...
     AppError: Bad response: 400 Bad Request (not 200 OK or 3xx redirect for /)
 
-    >>> del env['X-EXTFILE-TYPES']
+    >>> del env['HTTP_X_EXTFILE_TYPES']
     >>> print app.post('/', extra_environ=env,
     ...         upload_files=(('myfile',testFile('ipod.mp4')),),).body
     ---...
@@ -154,7 +154,7 @@
 
 Let us enable the filter by setting the environment.
 
-    >>> env = {'X-EXTFILE-HANDLE':'on'}
+    >>> env = {'HTTP_X_EXTFILE_HANDLE':'on'}
     >>> res = app.get('/%s' % info, extra_environ=env)
     >>> print res.body
     <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">



More information about the Checkins mailing list