diff --git a/server/render.js b/server/render.js index d5ac2420182a3..6d26eaeec89f8 100644 --- a/server/render.js +++ b/server/render.js @@ -2,6 +2,7 @@ import { join } from 'path' import { createElement } from 'react' import { renderToString, renderToStaticMarkup } from 'react-dom/server' import send from 'send' +import fs from 'mz/fs' import accepts from 'accepts' import mime from 'mime-types' import requireModule from './require' @@ -148,19 +149,29 @@ export async function serveStaticWithGzip (req, res, path) { return serveStatic(req, res, path) } + const gzipPath = `${path}.gz` + try { - const gzipPath = `${path}.gz` - const contentType = mime.lookup(path) || 'application/octet-stream' - res.setHeader('Content-Type', contentType) - res.setHeader('Content-Encoding', 'gzip') - await serveStatic(req, res, gzipPath) + // We need to check the existance of the gzipPath. + // Getting `ENOENT` error from the `serveStatic` is inconsistent and + // didn't work on all the cases. + // + // And this won't give us a race condition because we know that + // we don't add gzipped files at runtime. + await fs.stat(gzipPath) } catch (ex) { if (ex.code === 'ENOENT') { - res.removeHeader('Content-Encoding') + // Seems like there's no gzipped file. Let's serve the uncompressed file. return serveStatic(req, res, path) } + throw ex } + + const contentType = mime.lookup(path) || 'application/octet-stream' + res.setHeader('Content-Type', contentType) + res.setHeader('Content-Encoding', 'gzip') + return serveStatic(req, res, gzipPath) } export function serveStatic (req, res, path) {