diff --git a/packages/next-server/server/next-server.js b/packages/next-server/server/next-server.js index 94c57262..af15c0de 100644 --- a/packages/next-server/server/next-server.js +++ b/packages/next-server/server/next-server.js @@ -5,9 +5,9 @@ import { parse as parseQs } from 'querystring' import fs from 'fs' import { renderToHTML, - renderErrorToHTML, - sendHTML + renderErrorToHTML } from './render' +import {sendHTML} from './send-html' import {serveStatic} from './serve-static' import Router, {route} from './router' import { isInternalUrl, isBlockedPage } from './utils' @@ -189,7 +189,7 @@ export default class Server { if (this.nextConfig.poweredByHeader) { res.setHeader('X-Powered-By', 'Next.js ' + process.env.NEXT_VERSION) } - return sendHTML(req, res, html, req.method, this.renderOpts) + return sendHTML(req, res, html, this.renderOpts) } async renderToHTML (req, res, pathname, query) { @@ -210,7 +210,7 @@ export default class Server { async renderError (err, req, res, pathname, query) { res.setHeader('Cache-Control', 'no-cache, no-store, max-age=0, must-revalidate') const html = await this.renderErrorToHTML(err, req, res, pathname, query) - return sendHTML(req, res, html, req.method, this.renderOpts) + return sendHTML(req, res, html, this.renderOpts) } async renderErrorToHTML (err, req, res, pathname, query) { diff --git a/packages/next-server/server/render.js b/packages/next-server/server/render.js index ef068cd2..b6f39949 100644 --- a/packages/next-server/server/render.js +++ b/packages/next-server/server/render.js @@ -1,8 +1,6 @@ import { join } from 'path' import React from 'react' import { renderToString, renderToStaticMarkup } from 'react-dom/server' -import generateETag from 'etag' -import fresh from 'fresh' import {requirePage} from './require' import Router from '../lib/router/router' import { loadGetInitialProps, isResSent } from '../lib/utils' @@ -142,32 +140,6 @@ async function doRender (req, res, pathname, query, { return '' + renderToStaticMarkup(doc) } -export function sendHTML (req, res, html, method, { dev, generateEtags }) { - if (isResSent(res)) return - const etag = generateEtags && generateETag(html) - - if (fresh(req.headers, { etag })) { - res.statusCode = 304 - res.end() - return - } - - if (dev) { - // In dev, we should not cache pages for any reason. - res.setHeader('Cache-Control', 'no-store, must-revalidate') - } - - if (etag) { - res.setHeader('ETag', etag) - } - - if (!res.getHeader('Content-Type')) { - res.setHeader('Content-Type', 'text/html; charset=utf-8') - } - res.setHeader('Content-Length', Buffer.byteLength(html)) - res.end(method === 'HEAD' ? null : html) -} - function errorToJSON (err) { const { name, message, stack } = err const json = { name, message, stack } diff --git a/packages/next-server/server/send-html.ts b/packages/next-server/server/send-html.ts new file mode 100644 index 00000000..74db9d5f --- /dev/null +++ b/packages/next-server/server/send-html.ts @@ -0,0 +1,30 @@ +import {IncomingMessage, ServerResponse} from 'http' +import generateETag from 'etag' +import fresh from 'fresh' +import { isResSent } from '../lib/utils' + +export function sendHTML (req: IncomingMessage, res: ServerResponse, html: string, { dev, generateEtags }: {dev: boolean, generateEtags: boolean}) { + if (isResSent(res)) return + const etag = generateEtags ? generateETag(html) : undefined + + if (fresh(req.headers, { etag })) { + res.statusCode = 304 + res.end() + return + } + + if (dev) { + // In dev, we should not cache pages for any reason. + res.setHeader('Cache-Control', 'no-store, must-revalidate') + } + + if (etag) { + res.setHeader('ETag', etag) + } + + if (!res.getHeader('Content-Type')) { + res.setHeader('Content-Type', 'text/html; charset=utf-8') + } + res.setHeader('Content-Length', Buffer.byteLength(html)) + res.end(req.method === 'HEAD' ? null : html) +} diff --git a/packages/next/package.json b/packages/next/package.json index 88d05ebf..f7b0c456 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -101,6 +101,8 @@ "@types/babel__generator": "7.0.1", "@types/babel__template": "7.0.1", "@types/babel__traverse": "7.0.3", + "@types/etag": "1.8.0", + "@types/fresh": "0.5.0", "@types/nanoid": "1.2.0", "@types/node-fetch": "2.1.4", "@types/webpack": "4.4.20",