download_endpointstreams file content into the response body, with certain storages (FileSystem, SQL) it will use a buffer object when reading each chunk, which will make that, instead of each read chunk allocating a new string object, ever new chunk is read into the same buffer string object, replacing the content from the previous chunk.
Unfortunately, there are some parts of the Rack/Rails stack which rely on all chunks co-existing in the memory at the same time (for example the
Rack::ContentLenthmiddleware). For that reason, and to be consistent in behaviour and memory usage when used with other storages (S3), we modify
download_endpointnot to use the buffer object, and have each read chunk be a new string object.