Combine sendPayload and sendHTML (#15475)

This commit is contained in:
Gerald Monaco 2020-07-27 13:19:30 -07:00 committed by GitHub
parent 193ffe7616
commit 71bc0db92a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 37 additions and 52 deletions

View file

@ -83,6 +83,7 @@ export function createEntrypoints(
buildId,
assetPrefix: config.assetPrefix,
generateEtags: config.generateEtags,
poweredByHeader: config.poweredByHeader,
canonicalBase: config.canonicalBase,
basePath: config.basePath,
runtimeConfig: hasRuntimeConfig

View file

@ -22,6 +22,7 @@ export type ServerlessLoaderQuery = {
buildId: string
assetPrefix: string
generateEtags: string
poweredByHeader: string
canonicalBase: string
basePath: string
runtimeConfig: string
@ -43,6 +44,7 @@ const nextServerlessLoader: loader.Loader = function () {
absoluteDocumentPath,
absoluteErrorPath,
generateEtags,
poweredByHeader,
basePath,
runtimeConfig,
previewProps,
@ -266,7 +268,6 @@ const nextServerlessLoader: loader.Loader = function () {
const {parse: parseQs} = require('querystring')
const {renderToHTML} = require('next/dist/next-server/server/render');
const { tryGetPreviewData } = require('next/dist/next-server/server/api-utils');
const {sendHTML} = require('next/dist/next-server/server/send-html');
const {sendPayload} = require('next/dist/next-server/server/send-payload');
const buildManifest = require('${buildManifest}');
const reactLoadableManifest = require('${reactLoadableManifest}');
@ -494,9 +495,9 @@ const nextServerlessLoader: loader.Loader = function () {
await initServer()
const html = await renderReqToHTML(req, res)
if (html) {
sendHTML(req, res, html, {generateEtags: ${
generateEtags === 'true' ? true : false
}})
sendPayload(req, res, html, 'html', {generateEtags: ${JSON.stringify(
generateEtags === 'true'
)}, poweredByHeader: ${JSON.stringify(poweredByHeader === 'true')}})
}
} catch(err) {
console.error(err)

View file

@ -52,7 +52,6 @@ import Router, {
route,
Route,
} from './router'
import { sendHTML } from './send-html'
import { sendPayload } from './send-payload'
import { serveStatic } from './serve-static'
import { IncrementalCache } from './incremental-cache'
@ -813,7 +812,10 @@ export default class Server {
html: string
): Promise<void> {
const { generateEtags, poweredByHeader } = this.renderOpts
return sendHTML(req, res, html, { generateEtags, poweredByHeader })
return sendPayload(req, res, html, 'html', {
generateEtags,
poweredByHeader,
})
}
public async render(
@ -996,7 +998,10 @@ export default class Server {
res,
data,
isDataReq ? 'json' : 'html',
this.renderOpts.generateEtags,
{
generateEtags: this.renderOpts.generateEtags,
poweredByHeader: this.renderOpts.poweredByHeader,
},
!this.renderOpts.dev
? {
private: isPreviewMode,
@ -1126,7 +1131,10 @@ export default class Server {
html = renderResult.html
}
sendPayload(req, res, html, 'html', this.renderOpts.generateEtags)
sendPayload(req, res, html, 'html', {
generateEtags: this.renderOpts.generateEtags,
poweredByHeader: this.renderOpts.poweredByHeader,
})
return null
}
@ -1141,7 +1149,10 @@ export default class Server {
res,
isDataReq ? JSON.stringify(pageData) : html,
isDataReq ? 'json' : 'html',
this.renderOpts.generateEtags,
{
generateEtags: this.renderOpts.generateEtags,
poweredByHeader: this.renderOpts.poweredByHeader,
},
!this.renderOpts.dev || (isServerProps && !isDataReq)
? {
private: isPreviewMode,

View file

@ -1,37 +0,0 @@
import { IncomingMessage, ServerResponse } from 'http'
import generateETag from 'next/dist/compiled/etag'
import fresh from 'next/dist/compiled/fresh'
import { isResSent } from '../lib/utils'
export function sendHTML(
req: IncomingMessage,
res: ServerResponse,
html: string,
{
generateEtags,
poweredByHeader,
}: { generateEtags: boolean; poweredByHeader: boolean }
) {
if (isResSent(res)) return
const etag = generateEtags ? generateETag(html) : undefined
if (poweredByHeader) {
res.setHeader('X-Powered-By', 'Next.js')
}
if (fresh(req.headers, { etag })) {
res.statusCode = 304
res.end()
return
}
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)
}

View file

@ -8,7 +8,10 @@ export function sendPayload(
res: ServerResponse,
payload: any,
type: 'html' | 'json',
generateEtags: boolean,
{
generateEtags,
poweredByHeader,
}: { generateEtags: boolean; poweredByHeader: boolean },
options?:
| { private: true }
| { private: boolean; stateful: true }
@ -18,6 +21,10 @@ export function sendPayload(
return
}
if (poweredByHeader && type === 'html') {
res.setHeader('X-Powered-By', 'Next.js')
}
const etag = generateEtags ? generateETag(payload) : undefined
if (fresh(req.headers, { etag })) {
@ -30,10 +37,12 @@ export function sendPayload(
res.setHeader('ETag', etag)
}
res.setHeader(
'Content-Type',
type === 'json' ? 'application/json' : 'text/html; charset=utf-8'
)
if (!res.getHeader('Content-Type')) {
res.setHeader(
'Content-Type',
type === 'json' ? 'application/json' : 'text/html; charset=utf-8'
)
}
res.setHeader('Content-Length', Buffer.byteLength(payload))
if (options != null) {
if (options.private || options.stateful) {
@ -61,5 +70,5 @@ export function sendPayload(
)
}
}
res.end(payload)
res.end(req.method === 'HEAD' ? null : payload)
}