Commit 4d8f0c33 authored by Kirill Smelkov's avatar Kirill Smelkov

BigFile: Fix non-range download of just created big file

If in erp5 I go to big_file_module and 'Add Big File' action and then try to
download just-created empty bigfile I get a crash:

    curl ... --data 'format=raw'  http://localhost:8889/erp5/big_file_module/18

    ...
    <h2>Site Error</h2>

    <p>An error was encountered while publishing this
     resource.</p>

    <p>
      <strong>Error Type:
        AttributeError
      </strong>
      <br />
      <strong>Error Value:
        'str' object has no attribute 'iterate'
      </strong>
      <br />
    </p>

with exception traceback

    Traceback (innermost last):
      Module ZPublisher.Publish, line 138, in publish
        request, bind=1)
      Module ZPublisher.mapply, line 77, in mapply
        if debug is not None: return debug(object,args,context)
      Module ZPublisher.Publish, line 48, in call_object
        result=apply(object,args) # Type s<cr> to step into published object.
      Module Products.ERP5.Document.BigFile, line 297, in index_html
        for chunk in data.iterate():
    AttributeError: 'str' object has no attribute 'iterate'

I've compared BigFile code with the sample place in File code from Zope/src/OFS
(which is base class for BigFile)

    https://github.com/zopefoundation/Zope/blob/2.13/src/OFS/Image.py#L420

and in index_html(), if we requested the data itself, there it sees whether
self.data is either

    1) simply bytes (= str in python2), or

    2) linked-list of Pdata

and in BigFile we currently miss handling 1) case.

~~~~

BigFile, it looks, was copied-and-modified from Zope.OFS.Image.File first in
65121be7 (Support streaming big file in DMS.) Then in index_html download there
was only an 'iterate over btree chunks' case. Later in dff53681 (Get
modification date from btree.) a case for

    if data is None:
      return ''

was added before btree iteration.

Here we also restore original Zope code for returning file content if it is
string instance directly, because as it is experimentally observed, that case
can also happen.

The patch does not add tests, because currently BigFile class does not have
tests at all (at least I could not find them).
Reviewed-by: Romain Courteaud's avatarRomain Courteaud <romain@nexedi.com>
parent c80f4e47
...@@ -294,6 +294,9 @@ class BigFile(File): ...@@ -294,6 +294,9 @@ class BigFile(File):
if data is None: if data is None:
return '' return ''
if isinstance(data, str):
RESPONSE.setBase(None)
return data
for chunk in data.iterate(): for chunk in data.iterate():
RESPONSE.write(chunk) RESPONSE.write(chunk)
return '' return ''
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment