Skip to content

Commit

Permalink
Merge branch 'canary' into feedthejim/next-1078-change-prefetch-heuri…
Browse files Browse the repository at this point in the history
…stics-to-traverse
  • Loading branch information
feedthejim committed May 3, 2023
2 parents 5df26f8 + 70c6f94 commit 96fbe3c
Show file tree
Hide file tree
Showing 6 changed files with 95 additions and 93 deletions.
2 changes: 1 addition & 1 deletion packages/next/src/server/api-utils/node.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ import {
PRERENDER_REVALIDATE_HEADER,
PRERENDER_REVALIDATE_ONLY_GENERATED_HEADER,
} from '../../lib/constants'
import { invokeRequest } from '../lib/server-ipc'
import { invokeRequest } from '../lib/server-ipc/invoke-request'

export function tryGetPreviewData(
req: IncomingMessage | BaseNextRequest | Request,
Expand Down
2 changes: 1 addition & 1 deletion packages/next/src/server/dev/next-dev-server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ import { IncrementalCache } from '../lib/incremental-cache'
import LRUCache from 'next/dist/compiled/lru-cache'
import { NextUrlWithParsedQuery } from '../request-meta'
import { deserializeErr, errorToJSON } from '../render'
import { invokeRequest } from '../lib/server-ipc'
import { invokeRequest } from '../lib/server-ipc/invoke-request'
import { generateInterceptionRoutesRewrites } from '../../lib/generate-interception-routes-rewrites'

// Load ReactDevOverlay only when needed
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import type NextServer from '../next-server'
import { genExecArgv, getNodeOptionsWithoutInspect } from './utils'
import { deserializeErr, errorToJSON } from '../render'
import { IncomingMessage } from 'http'
import type NextServer from '../../next-server'

import { genExecArgv, getNodeOptionsWithoutInspect } from '../utils'
import { deserializeErr, errorToJSON } from '../../render'
import crypto from 'crypto'
import isError from '../../lib/is-error'
import isError from '../../../lib/is-error'

// we can't use process.send as jest-worker relies on
// it already and can cause unexpected message errors
Expand Down Expand Up @@ -88,7 +88,7 @@ export const createWorker = (
) => {
const { initialEnv } = require('@next/env') as typeof import('@next/env')
const { Worker } = require('next/dist/compiled/jest-worker')
const worker = new Worker(require.resolve('./render-server'), {
const worker = new Worker(require.resolve('../render-server'), {
numWorkers: 1,
// TODO: do we want to allow more than 10 OOM restarts?
maxRetries: 10,
Expand Down Expand Up @@ -125,94 +125,13 @@ export const createWorker = (
'clearModuleContext',
],
}) as any as InstanceType<typeof Worker> & {
initialize: typeof import('./render-server').initialize
deleteCache: typeof import('./render-server').deleteCache
deleteAppClientCache: typeof import('./render-server').deleteAppClientCache
initialize: typeof import('../render-server').initialize
deleteCache: typeof import('../render-server').deleteCache
deleteAppClientCache: typeof import('../render-server').deleteAppClientCache
}

worker.getStderr().pipe(process.stderr)
worker.getStdout().pipe(process.stdout)

return worker
}

const forbiddenHeaders = [
'accept-encoding',
'content-length',
'keepalive',
'content-encoding',
'transfer-encoding',
// https://github.com/nodejs/undici/issues/1470
'connection',
]

export const filterReqHeaders = (
headers: Record<string, undefined | string | string[]>
) => {
for (const [key, value] of Object.entries(headers)) {
if (
forbiddenHeaders.includes(key) ||
!(Array.isArray(value) || typeof value === 'string')
) {
delete headers[key]
}
}
return headers
}

export const invokeRequest = async (
targetUrl: string,
requestInit: {
headers: IncomingMessage['headers']
method: IncomingMessage['method']
},
readableBody?: import('stream').Readable
) => {
const parsedUrl = new URL(targetUrl)

// force localhost to IPv4 as some DNS may
// resolve to IPv6 instead
if (parsedUrl.hostname === 'localhost') {
parsedUrl.hostname = '127.0.0.1'
}
const invokeHeaders = filterReqHeaders({
...requestInit.headers,
}) as IncomingMessage['headers']

const invokeRes = await new Promise<IncomingMessage>(
(resolveInvoke, rejectInvoke) => {
const http = require('http') as typeof import('http')

try {
const invokeReq = http.request(
targetUrl,
{
headers: invokeHeaders,
method: requestInit.method,
},
(res) => {
resolveInvoke(res)
}
)
invokeReq.on('error', (err) => {
rejectInvoke(err)
})

if (requestInit.method !== 'GET' && requestInit.method !== 'HEAD') {
if (readableBody) {
readableBody.pipe(invokeReq)
readableBody.on('close', () => {
invokeReq.end()
})
}
} else {
invokeReq.end()
}
} catch (err) {
rejectInvoke(err)
}
}
)

return invokeRes
}
59 changes: 59 additions & 0 deletions packages/next/src/server/lib/server-ipc/invoke-request.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
import { IncomingMessage } from 'http'
import { filterReqHeaders } from './utils'

export const invokeRequest = async (
targetUrl: string,
requestInit: {
headers: IncomingMessage['headers']
method: IncomingMessage['method']
},
readableBody?: import('stream').Readable
) => {
const parsedUrl = new URL(targetUrl)

// force localhost to IPv4 as some DNS may
// resolve to IPv6 instead
if (parsedUrl.hostname === 'localhost') {
parsedUrl.hostname = '127.0.0.1'
}
const invokeHeaders = filterReqHeaders({
...requestInit.headers,
}) as IncomingMessage['headers']

const invokeRes = await new Promise<IncomingMessage>(
(resolveInvoke, rejectInvoke) => {
const http = require('http') as typeof import('http')

try {
const invokeReq = http.request(
targetUrl,
{
headers: invokeHeaders,
method: requestInit.method,
},
(res) => {
resolveInvoke(res)
}
)
invokeReq.on('error', (err) => {
rejectInvoke(err)
})

if (requestInit.method !== 'GET' && requestInit.method !== 'HEAD') {
if (readableBody) {
readableBody.pipe(invokeReq)
readableBody.on('close', () => {
invokeReq.end()
})
}
} else {
invokeReq.end()
}
} catch (err) {
rejectInvoke(err)
}
}
)

return invokeRes
}
23 changes: 23 additions & 0 deletions packages/next/src/server/lib/server-ipc/utils.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
const forbiddenHeaders = [
'accept-encoding',
'content-length',
'keepalive',
'content-encoding',
'transfer-encoding',
// https://github.com/nodejs/undici/issues/1470
'connection',
]

export const filterReqHeaders = (
headers: Record<string, undefined | string | string[]>
) => {
for (const [key, value] of Object.entries(headers)) {
if (
forbiddenHeaders.includes(key) ||
!(Array.isArray(value) || typeof value === 'string')
) {
delete headers[key]
}
}
return headers
}
3 changes: 2 additions & 1 deletion packages/next/src/server/next-server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,8 @@ import { getRouteRegex } from '../shared/lib/router/utils/route-regex'
import { removePathPrefix } from '../shared/lib/router/utils/remove-path-prefix'
import { addPathPrefix } from '../shared/lib/router/utils/add-path-prefix'
import { pathHasPrefix } from '../shared/lib/router/utils/path-has-prefix'
import { filterReqHeaders, invokeRequest } from './lib/server-ipc'
import { invokeRequest } from './lib/server-ipc/invoke-request'
import { filterReqHeaders } from './lib/server-ipc/utils'
import { createRequestResponseMocks } from './lib/mock-request'

export * from './base-server'
Expand Down

0 comments on commit 96fbe3c

Please sign in to comment.