From c2d6c85e5d9452b348fa14a711c9624bb740eb3e Mon Sep 17 00:00:00 2001 From: Zaid Abdulla Date: Tue, 14 Aug 2018 16:17:27 -0700 Subject: [PATCH] Fix chunked encoding issue --- server/api.js | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/server/api.js b/server/api.js index 9d4eb0b..6c2fca3 100644 --- a/server/api.js +++ b/server/api.js @@ -2,7 +2,6 @@ const zlib = require("zlib"); const Router = require("koa-router"); -const PassThrough = require("stream").PassThrough; const config = require("./config"); const db = require("./db"); const apiFunctions = require("./api-functions"); @@ -79,19 +78,21 @@ for (let [resource, flags] of Object.entries(resources)) { let stream; switch (ctx.acceptsEncodings("gzip", "deflate", "identity")) { case "gzip": - stream = zlib.createGzip(); + stream = zlib.createGzip({ flush: zlib.constants.Z_SYNC_FLUSH }); + stream.pipe(ctx.res); ctx.set("Content-Encoding", "gzip"); break; case "deflate": - stream = zlib.createDeflate(); + stream = zlib.createDeflate({ flush: zlib.constants.Z_SYNC_FLUSH }); + stream.pipe(ctx.res); ctx.set("Content-Encoding", "deflate"); break; default: - stream = new PassThrough(); + stream = ctx.res; break; } - ctx.body = stream; + ctx.body = ctx.res; ctx.type = "application/json"; let c = 0; @@ -134,20 +135,25 @@ for (let [resource, flags] of Object.entries(resources)) { let stream; switch (ctx.acceptsEncodings("gzip", "deflate", "identity")) { case "gzip": - stream = zlib.createGzip(); + stream = zlib.createGzip({ flush: zlib.constants.Z_SYNC_FLUSH }); + stream.pipe(ctx.res); ctx.set("Content-Encoding", "gzip"); break; case "deflate": - stream = zlib.createDeflate(); + stream = zlib.createDeflate({ flush: zlib.constants.Z_SYNC_FLUSH }); + stream.pipe(ctx.res); ctx.set("Content-Encoding", "deflate"); break; default: - stream = new PassThrough(); + stream = ctx.res; break; } - ctx.body = stream; + ctx.body = ctx.res; ctx.type = "text/csv"; + ctx.attachment( + `${resource}-${new Date(now).toISOString().replace(/[:.]/g, "")}.csv` + ); stream.write( Object.keys(columns).map(k => `"${k.replace(/"/, '""')}"`) + "\n"