From 79aec2d3cc13f2a0e513a568c7a64c28a42f39fb Mon Sep 17 00:00:00 2001 From: Shu Ding Date: Fri, 22 Jul 2022 19:50:45 +0200 Subject: [PATCH] move cloneable body to node server --- packages/next/server/base-server.ts | 24 +++++------------------- packages/next/server/next-server.ts | 25 ++++++++++++++++++++++++- packages/next/server/web-server.ts | 9 ++++++++- 3 files changed, 37 insertions(+), 21 deletions(-) diff --git a/packages/next/server/base-server.ts b/packages/next/server/base-server.ts index 87d5e63916b9..25caf27e9aaa 100644 --- a/packages/next/server/base-server.ts +++ b/packages/next/server/base-server.ts @@ -16,7 +16,6 @@ import type { ParsedUrlQuery } from 'querystring' import type { RenderOpts, RenderOptsPartial } from './render' import type { ResponseCacheEntry, ResponseCacheValue } from './response-cache' import type { UrlWithParsedQuery } from 'url' -import type { TLSSocket } from 'tls' import { CacheFs, NormalizeError, @@ -27,7 +26,6 @@ import { import type { PreviewData } from 'next/types' import type { PagesManifest } from '../build/webpack/plugins/pages-manifest-plugin' import type { BaseNextRequest, BaseNextResponse } from './base-http' -import type { NodeNextRequest } from './base-http/node' import type { PayloadOptions } from './send-payload' import { join, resolve } from '../shared/lib/isomorphic/path' @@ -80,7 +78,6 @@ import { getHostname } from '../shared/lib/get-hostname' import { parseUrl as parseUrlUtil } from '../shared/lib/router/utils/parse-url' import { getNextPathnameInfo } from '../shared/lib/router/utils/get-next-pathname-info' import { normalizePagePath } from '../shared/lib/page-path/normalize-page-path' -import { getClonableBody } from './body-streams' export type FindComponentsResult = { components: LoadComponentsReturnType @@ -230,6 +227,10 @@ export default abstract class Server { protected abstract getRoutesManifest(): CustomRoutes protected abstract getPrerenderManifest(): PrerenderManifest protected abstract getServerComponentManifest(): any + protected abstract attachRequestMeta( + req: BaseNextRequest, + parsedUrl: NextUrlWithParsedQuery + ): void protected abstract sendRenderResult( req: BaseNextRequest, @@ -419,22 +420,7 @@ export default abstract class Server { parsedUrl.query = parseQs(parsedUrl.query) } - const protocol = ( - (req as NodeNextRequest).originalRequest?.socket as TLSSocket - )?.encrypted - ? 'https' - : 'http' - - // When there are hostname and port we build an absolute URL - const initUrl = - this.hostname && this.port - ? `${protocol}://${this.hostname}:${this.port}${req.url}` - : req.url - - addRequestMeta(req, '__NEXT_INIT_URL', initUrl) - addRequestMeta(req, '__NEXT_INIT_QUERY', { ...parsedUrl.query }) - addRequestMeta(req, '_protocol', protocol) - addRequestMeta(req, '__NEXT_CLONABLE_BODY', getClonableBody(req.body)) + this.attachRequestMeta(req, parsedUrl) const domainLocale = detectDomainLocale( this.nextConfig.i18n?.domains, diff --git a/packages/next/server/next-server.ts b/packages/next/server/next-server.ts index e6c61675fccc..275415eada62 100644 --- a/packages/next/server/next-server.ts +++ b/packages/next/server/next-server.ts @@ -1,6 +1,7 @@ import './node-polyfill-fetch' import './node-polyfill-web-streams' +import type { TLSSocket } from 'tls' import type { Route } from './router' import { CacheFs, @@ -80,7 +81,7 @@ import { urlQueryToSearchParams } from '../shared/lib/router/utils/querystring' import ResponseCache from '../server/response-cache' import { removeTrailingSlash } from '../shared/lib/router/utils/remove-trailing-slash' import { getNextPathnameInfo } from '../shared/lib/router/utils/get-next-pathname-info' -import { bodyStreamToNodeStream } from './body-streams' +import { bodyStreamToNodeStream, getClonableBody } from './body-streams' import { checkIsManualRevalidate } from './api-utils' import { isDynamicRoute } from '../shared/lib/router/utils' import { shouldUseReactRoot } from './utils' @@ -1511,6 +1512,28 @@ export default class NextNodeServer extends BaseServer { return require(join(this.distDir, ROUTES_MANIFEST)) } + protected attachRequestMeta( + req: BaseNextRequest, + parsedUrl: NextUrlWithParsedQuery + ) { + const protocol = ( + (req as NodeNextRequest).originalRequest?.socket as TLSSocket + )?.encrypted + ? 'https' + : 'http' + + // When there are hostname and port we build an absolute URL + const initUrl = + this.hostname && this.port + ? `${protocol}://${this.hostname}:${this.port}${req.url}` + : req.url + + addRequestMeta(req, '__NEXT_INIT_URL', initUrl) + addRequestMeta(req, '__NEXT_INIT_QUERY', { ...parsedUrl.query }) + addRequestMeta(req, '_protocol', protocol) + addRequestMeta(req, '__NEXT_CLONABLE_BODY', getClonableBody(req.body)) + } + protected async runEdgeFunction(params: { req: BaseNextRequest | NodeNextRequest res: BaseNextResponse | NodeNextResponse diff --git a/packages/next/server/web-server.ts b/packages/next/server/web-server.ts index 55dc69b5e7aa..9b067fb5e1f8 100644 --- a/packages/next/server/web-server.ts +++ b/packages/next/server/web-server.ts @@ -1,7 +1,7 @@ import type { WebNextRequest, WebNextResponse } from './base-http/web' import type { RenderOpts } from './render' import type RenderResult from './render-result' -import type { NextParsedUrlQuery } from './request-meta' +import type { NextParsedUrlQuery, NextUrlWithParsedQuery } from './request-meta' import type { Params } from '../shared/lib/router/utils/route-matcher' import type { PayloadOptions } from './send-payload' import type { LoadComponentsReturnType } from './load-components' @@ -11,6 +11,7 @@ import BaseServer from './base-server' import { renderToHTML } from './render' import { byteLength } from './api-utils/web' import { generateETag } from './lib/etag' +import { addRequestMeta } from './request-meta' interface WebServerOptions extends Options { webServerConfig: { @@ -103,6 +104,12 @@ export default class NextWebServer extends BaseServer { protected getFilesystemPaths() { return new Set() } + protected attachRequestMeta( + req: WebNextRequest, + parsedUrl: NextUrlWithParsedQuery + ) { + addRequestMeta(req, '__NEXT_INIT_QUERY', { ...parsedUrl.query }) + } protected getPrerenderManifest() { return { version: 3 as const,