[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