bravado icon indicating copy to clipboard operation
bravado copied to clipboard

Slow handling response of large binary files (application/octet format)

Open rubyshamir opened this issue 5 years ago • 4 comments

Hello and thanks for this great software!

We have a swagger definition containing a "GET" command returning a large file (format: "application/octet-stream").

The current implementation of response() eventually calls "unmarshal_response_inner" in "http_future.py". This method does not have a specific handling for binary data and encodes the data to string.

On large files, like in our case, this is a very time consuming process (2-3 seconds per 0.5 MB). We have locally altered the code to return the binary data in case of "application/octet-stream" format and the time was reduced to ~0.1 seconds per 0.5 MB.

The altered function is as follows:

def unmarshal_response_inner(response, op):    
    ...
    # Code we added ##
    if content_type.startswith('application/octet'):
        return response.raw_bytes

    # TODO: Non-json response contents
    return response.text

We will be glad to learn if there is another workaround without changing the code.

Thanks in advance,

Ruby

rubyshamir avatar Oct 22 '18 10:10 rubyshamir

We also encountered this scenario recently and implemented a similar workaround. Would you accept a PR with a change like Ruby has suggested? In our case we are working with Excel files so our content type is application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.

gp-greg avatar Feb 11 '19 15:02 gp-greg

@greenphire-greg PRs are always welcome 😉

I'm still unsure about what should be the more appropriate return value in case of a response is not json or msg-pack.

macisamuele avatar Feb 11 '19 15:02 macisamuele

I was hesitant to suggest changing the default return value too. I made a PR in the bravado-core repo, which if accepted I believe will need to be re-implemented here as well? (The distinction between bravado and bravado-core is not totally clear to me.)

https://github.com/Yelp/bravado-core/pull/317

gp-greg avatar Feb 11 '19 17:02 gp-greg

Would be nicer to also do this for image/, audio/, video/* responses.

advance512 avatar Nov 23 '21 23:11 advance512