Skip to content

Commit

Permalink
Handle ValueError exceptions when doing a range request.
Browse files Browse the repository at this point in the history
  • Loading branch information
batlock666 committed Jun 26, 2017
1 parent 8da4b67 commit 233faa2
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 9 deletions.
4 changes: 3 additions & 1 deletion CHANGES.rst
Expand Up @@ -10,7 +10,9 @@ New:

Fixes:

- *add item here*
- Handle ``ValueError`` exceptions when doing a range request.
This fixes `issue #39 <https://github.com/plone/plone.app.blob/issues/39>`_.
[batlock666]


1.5.17 (2016-02-15)
Expand Down
19 changes: 11 additions & 8 deletions src/plone/app/blob/download.py
Expand Up @@ -71,12 +71,15 @@ def handleRequestRange(instance, length, REQUEST, RESPONSE):
ranges = None
RESPONSE.setHeader('Accept-Ranges', 'bytes')
if ranges and len(ranges) == 1:
[(start, end)] = expandRanges(ranges, length)
size = end - start
RESPONSE.setHeader('Content-Length', size)
RESPONSE.setHeader(
'Content-Range',
'bytes %d-%d/%d' % (start, end - 1, length))
RESPONSE.setStatus(206) # Partial content
return dict(start=start, end=end)
try:
[(start, end)] = expandRanges(ranges, length)
size = end - start
RESPONSE.setHeader('Content-Length', size)
RESPONSE.setHeader(
'Content-Range',
'bytes %d-%d/%d' % (start, end - 1, length))
RESPONSE.setStatus(206) # Partial content
return dict(start=start, end=end)
except ValueError:
return {}
return {}
15 changes: 15 additions & 0 deletions src/plone/app/blob/tests/test_integration.py
Expand Up @@ -149,6 +149,21 @@ def testRangeSupport(self):
iterator = blob.download(request)
self.assertEqual(data[-20:], ''.join(iterator))

def testOutsideRange(self):
# ranges outside the file size also have to work
blob = self.folder['blob']
blob.setTitle('foo')
blob.setFile(getData('plone.pdf'))
data = blob.getFile().getBlob().open('r').read()
l = len(data)
request = self.folder.REQUEST
request.environ['HTTP_RANGE'] = 'bytes={}-{}'.format(l * 2, l * 3)
iterator = blob.download(request)
self.assertEqual(data, ''.join(iterator))
request.environ['HTTP_RANGE'] = 'bytes={}-'.format(l * 2)
iterator = blob.download(request)
self.assertEqual(data, ''.join(iterator))

def testIcon(self):
blob = self.folder.blob
blob.update(file=getImage())
Expand Down

1 comment on commit 233faa2

@gforcada
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@batlock666 seems that this test is failing on python 2.6 (Plone 4.3 is officially supported on Python 2.6 still).

Would you mind having a look at it? See the jenkins report: http://jenkins.plone.org/job/plone-4.3-python-2.6/66

Please sign in to comment.