[Workbench] Report HTTP error instead of sending 0-byte file when error fetching from keep
Workbench shows files from collections by piping from arv-get. If arv-get can't download the file for any reason, Workbench returns a 200 OK status, with a 0-byte response.
- Add an attribute to CollectionsController's FileStreamer class, and corresponding test stub classes, that captures the exit status of arv-get (
$?). Before arv-get is run, this attribute is
- Near the end of CollectionsController#show_file, capture the FileStreamer created by file_enumerator. Hook up its
response.streamas we do now. In the ensure block, if we haven't written any bytes to
response.streamand the arv-get exit attribute does not have status 0, set
response.status = 500.
#2 Updated by Tom Clegg over 2 years ago
Workbench imagines itself to be in "sending data to client, impossible to change headers" mode even when it fails to get the very first data byte from Keep. The more general version of this problem is a bit harder, but if the first block fails, it should be easy enough to 5xx.
See show_file around source:apps/workbench/app/controllers/collections_controller.rb#L153
At least if the file size is handed to us in
params[:size]: if the file size is non-zero but no bytes are sent, send an HTTP 5xx error.