Skip to content

Commit

Permalink
Add request.files and fix UploadedFile argument handler
Browse files Browse the repository at this point in the history
  • Loading branch information
mrj0 committed Oct 23, 2013
1 parent f9fb921 commit 00182d6
Show file tree
Hide file tree
Showing 4 changed files with 63 additions and 5 deletions.
8 changes: 4 additions & 4 deletions nudge/arg.py
Original file line number Diff line number Diff line change
Expand Up @@ -244,11 +244,11 @@ class UploadedFile(CustomArg):

def __init__(self, name):
def func(req, inargs):
f = req.files[name][0]
f = req.files[name]
return {
'filename': f['filename'],
'data': f['body'],
'content_type': f['content_type'],
'filename': f.filename,
'data': f.value,
'content_type': f.type,
}
self.argspec = func

Expand Down
9 changes: 8 additions & 1 deletion nudge/publisher.py
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,7 @@ def __init__(self, req_dict):
self.remote_ip = self.req.get('REMOTE_ADDR', self.req.get('HTTP_REMOTE_ADDR'))
self.body = self.req.get('wsgi.input').read()
self._buffer = ''
self.files = {}

@lazyprop
def path(self):
Expand Down Expand Up @@ -214,6 +215,7 @@ def cookies(self):
@lazyprop
def arguments(self):
_arguments = {}
_files = {}
try:
# First url decode
tmp = self.req.get('QUERY_STRING', '')
Expand Down Expand Up @@ -253,7 +255,10 @@ def arguments(self):
keep_blank_values=1
)
for k in fs.keys():
_arguments[k] = fs[k].value
part = fs[k]
if part.filename:
_files[k] = part
_arguments[k] = part.value
except:
_log.exception(
"problem parsing multipart/form-data"
Expand All @@ -267,6 +272,8 @@ def arguments(self):

except (ValueError):
raise HTTPException(400, "body is not JSON")

self.files = _files
return _arguments

def write(self, content):
Expand Down
25 changes: 25 additions & 0 deletions tests/test_args.py
Original file line number Diff line number Diff line change
Expand Up @@ -678,3 +678,28 @@ def test_dict_in_body_fail(self):
i = args.Dict("test")
self.assertEqual([], i.argspec(req, None))

def test_uploaded_file(self):
input = StringIO.StringIO('''
-----------------------------41184676334
Content-Disposition: form-data; name="caption"
Summer vacation
-----------------------------41184676334
Content-Disposition: form-data; name="upload"; filename="extra_data.txt"
Content-Type: text/plain
Some more data about my vacation
-----------------------------41184676334--
''')
request = WSGIRequest({
'REQUEST_METHOD': 'POST',
'REMOTE_ADDR': '127.0.0.1',
'CONTENT_TYPE': 'multipart/form-data; boundary=---------------------------41184676334',
'wsgi.input': input,
})

upload = args.UploadedFile('upload')
assert 'upload' in request.arguments
assert 'upload' in request.files
f = upload.argspec(request, None)
self.assertIsNotNone(f)
26 changes: 26 additions & 0 deletions tests/test_wsgirequest.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,3 +31,29 @@ def test_xff_header_eventlet(self):
assert req.headers['X-Forwarded-For'] == '10.0.10.123'
assert req.headers.get('X-Forwarded-For') == '10.0.10.123', req.headers.get('X-Forwarded-For')

def test_request_files(self):
input = StringIO.StringIO('''
-----------------------------41184676334
Content-Disposition: form-data; name="caption"
Summer vacation
-----------------------------41184676334
Content-Disposition: form-data; name="upload"; filename="extra_data.txt"
Content-Type: text/plain
Some more data about my vacation
-----------------------------41184676334--
''')
request = WSGIRequest({
'REQUEST_METHOD': 'POST',
'REMOTE_ADDR': '127.0.0.1',
'CONTENT_TYPE': 'multipart/form-data; boundary=---------------------------41184676334',
'wsgi.input': input,
})

args = request.arguments
assert args['caption'] == 'Summer vacation'
assert args['upload'] == 'Some more data about my vacation'
assert len(request.files) == 1, 'should have parsed a single file'
assert request.files['upload'].filename == 'extra_data.txt'
assert request.files['upload'].value.strip() == 'Some more data about my vacation'

0 comments on commit 00182d6

Please sign in to comment.