The upstream gcp aggressively closes the connection once it has
received Content-Length bytes. However the @google-cloud/storage
module doesn't handle this well and emits no event in this case.
We were setting Content-Length because it's slightly more
efficient and was important for our download progress
bar (not anymore). The download should function fine without
setting the Content-Length, and allows the storage stream to finish
before closing the upstream socket.
This commit is contained in:
Danny Coates 2018-11-14 09:50:12 -08:00
parent e264d0da62
commit 6184a70ba4
No known key found for this signature in database
GPG key ID: 4C442633C62E00CB
4 changed files with 7 additions and 16 deletions

View file

@ -6,13 +6,6 @@ module.exports = async function(req, res) {
const id = req.params.id;
try {
const meta = req.meta;
const contentLength = await storage.length(id);
res.writeHead(200, {
'Content-Disposition': 'attachment',
'Content-Type': 'application/octet-stream',
'Content-Length': contentLength,
'WWW-Authenticate': `send-v1 ${req.nonce}`
});
const file_stream = storage.get(id);
let cancelled = false;
@ -21,7 +14,7 @@ module.exports = async function(req, res) {
file_stream.destroy();
});
file_stream.on('end', async () => {
file_stream.pipe(res).on('finish', async () => {
if (cancelled) {
return;
}
@ -38,8 +31,6 @@ module.exports = async function(req, res) {
log.info('StorageError:', id);
}
});
file_stream.pipe(res);
} catch (e) {
res.sendStatus(404);
}