Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
dbb435c
Added missing default style for FileField
kchang Nov 12, 2014
ad060aa
More helpful error message when default `.create` fails. Closes #2013.
gregmuellegger Nov 15, 2014
2f03483
Removed unused models
maryokhin Nov 29, 2014
dd9d40d
Moved non-conflicting models
maryokhin Nov 29, 2014
e2ea98e
Fixed typos
maryokhin Nov 29, 2014
bc0c25d
Consolidate Django and test requirements
jpadilla Dec 1, 2014
0a91999
Merge branch 'master' of github.com:tomchristie/django-rest-framework
maryokhin Dec 2, 2014
d847e33
Merge pull request #2161 from NextHub/master
lovelydinosaur Dec 2, 2014
deec61e
Merge pull request #2173 from jpadilla/master
lovelydinosaur Dec 2, 2014
f4fc467
Promote 'many_init' to public API. Closes #2152.
lovelydinosaur Dec 2, 2014
53f5276
Not allow to pass an empty actions to viewset.as_view(). Refs issue #…
BrickXu Dec 2, 2014
6ac79b8
Document Field.fail(). Closes #2147.
lovelydinosaur Dec 2, 2014
79e18a2
Raise assertion error if calling .save() on a serializer with errors.…
lovelydinosaur Dec 2, 2014
54b7b32
Merge branch 'fixes/2013' of git://github.com/gregmuellegger/django-r…
lovelydinosaur Dec 2, 2014
76ac641
Minor tweaks for helpful message on Model.objects.create() failure.
lovelydinosaur Dec 2, 2014
41045c1
Merge branch 'gregmuellegger-fixes/2013'
lovelydinosaur Dec 2, 2014
e30e3f6
Update README with 3.0 info.
lovelydinosaur Dec 2, 2014
0359e92
FileUploadParser. Raising StopFutureHandlers removes any handlers not…
lovelydinosaur Dec 2, 2014
84cff98
fix typo
daaray Dec 2, 2014
e335ad4
Merge pull request #2181 from daaray/patch-2
lovelydinosaur Dec 2, 2014
33096a1
BindingDict inherits from collections.MutableMapping. Closes #2135.
lovelydinosaur Dec 2, 2014
2123685
Merge branch 'master' of https://github.com/tomchristie/django-rest-f…
lovelydinosaur Dec 2, 2014
5ad22ae
Updated serializers documentation
cript0nauta Dec 2, 2014
95d57e6
Merge pull request #2182 from sh4r3m4n/master
lovelydinosaur Dec 2, 2014
9397a65
Use svg version of travis build status badge
eiriksm Dec 3, 2014
71a8cb2
Merge pull request #2185 from eiriksm/patch-1
lovelydinosaur Dec 3, 2014
c5a2d50
Merge pull request #2175 from BrickXu/fix_2171
lovelydinosaur Dec 3, 2014
74a9ece
Update build status icon on github pages page.
eiriksm Dec 3, 2014
5f2f54b
Merge pull request #2188 from eiriksm/patch-2
lovelydinosaur Dec 3, 2014
f2dd05a
Improved nested update test in update().
lovelydinosaur Dec 3, 2014
e1d98f7
Improve nested update and create testing.
lovelydinosaur Dec 3, 2014
ab25d70
Renamed validated_attrs to validated_data to be more in line with oth…
mtschammer Dec 3, 2014
66bce38
Merge pull request #2196 from tomchristie/tomchristie-improve-update-…
kevin-brown Dec 3, 2014
f221b73
Merge pull request #2197 from mtschammer/mtschammer-validated_attrs-r…
lovelydinosaur Dec 3, 2014
e8cbf41
Merge pull request #2172 from kchange/master
lovelydinosaur Dec 4, 2014
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
FileUploadParser. Raising StopFutureHandlers removes any handlers not…
… yet run for the active set. Closes encode#2109.
  • Loading branch information
lovelydinosaur committed Dec 2, 2014
commit 0359e9250d34e18aef2db6216f24c130a4f51fce
13 changes: 7 additions & 6 deletions rest_framework/parsers.py
Original file line number Diff line number Diff line change
Expand Up @@ -256,23 +256,24 @@ def parse(self, stream, media_type=None, parser_context=None):
chunks = ChunkIter(stream, chunk_size)
counters = [0] * len(upload_handlers)

for handler in upload_handlers:
for index, handler in enumerate(upload_handlers):
try:
handler.new_file(None, filename, content_type,
content_length, encoding)
except StopFutureHandlers:
upload_handlers = upload_handlers[:index + 1]
break

for chunk in chunks:
for i, handler in enumerate(upload_handlers):
for index, handler in enumerate(upload_handlers):
chunk_length = len(chunk)
chunk = handler.receive_data_chunk(chunk, counters[i])
counters[i] += chunk_length
chunk = handler.receive_data_chunk(chunk, counters[index])
counters[index] += chunk_length
if chunk is None:
break

for i, handler in enumerate(upload_handlers):
file_obj = handler.file_complete(counters[i])
for index, handler in enumerate(upload_handlers):
file_obj = handler.file_complete(counters[index])
if file_obj:
return DataAndFiles(None, {'file': file_obj})
raise ParseError("FileUpload parse error - "
Expand Down
32 changes: 30 additions & 2 deletions tests/test_parsers.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
# -*- coding: utf-8 -*-

from __future__ import unicode_literals
from rest_framework.compat import StringIO
from django import forms
from django.core.files.uploadhandler import MemoryFileUploadHandler
from django.test import TestCase
from django.utils import unittest
from rest_framework.compat import etree
from rest_framework.compat import StringIO
from rest_framework.exceptions import ParseError
from rest_framework.parsers import FormParser, FileUploadParser
from rest_framework.parsers import XMLParser
import datetime
Expand Down Expand Up @@ -104,13 +105,40 @@ class MockRequest(object):
self.parser_context = {'request': request, 'kwargs': {}}

def test_parse(self):
""" Make sure the `QueryDict` works OK """
"""
Parse raw file upload.
"""
parser = FileUploadParser()
self.stream.seek(0)
data_and_files = parser.parse(self.stream, None, self.parser_context)
file_obj = data_and_files.files['file']
self.assertEqual(file_obj._size, 14)

def test_parse_missing_filename(self):
"""
Parse raw file upload when filename is missing.
"""
parser = FileUploadParser()
self.stream.seek(0)
self.parser_context['request'].META['HTTP_CONTENT_DISPOSITION'] = ''
with self.assertRaises(ParseError):
parser.parse(self.stream, None, self.parser_context)

def test_parse_missing_filename_multiple_upload_handlers(self):
"""
Parse raw file upload with multiple handlers when filename is missing.
Regression test for #2109.
"""
parser = FileUploadParser()
self.stream.seek(0)
self.parser_context['request'].upload_handlers = (
MemoryFileUploadHandler(),
MemoryFileUploadHandler()
)
self.parser_context['request'].META['HTTP_CONTENT_DISPOSITION'] = ''
with self.assertRaises(ParseError):
parser.parse(self.stream, None, self.parser_context)

def test_get_filename(self):
parser = FileUploadParser()
filename = parser.get_filename(self.stream, None, self.parser_context)
Expand Down