From 3f00a486820b448b75707f8464fe83cfb03d5117 Mon Sep 17 00:00:00 2001 From: Ali Yusuf <17704100+AliYusuf95@users.noreply.github.com> Date: Sat, 18 Jun 2022 14:07:27 +0300 Subject: [PATCH 1/4] fix(next): bind new stream functions with base incomingMessage object Closes: #37805 --- packages/next/server/body-streams.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/next/server/body-streams.ts b/packages/next/server/body-streams.ts index 19a3c20c004b9..6e04e3c771eed 100644 --- a/packages/next/server/body-streams.ts +++ b/packages/next/server/body-streams.ts @@ -41,7 +41,7 @@ function replaceRequestBody( for (const key in stream) { let v = stream[key as keyof Readable] as any if (typeof v === 'function') { - v = v.bind(stream) + v = v.bind(base) } base[key as keyof T] = v } From 08b8e2f4f0725d57f1ce34b0f34655738b88ab3e Mon Sep 17 00:00:00 2001 From: Ali Yusuf <17704100+AliYusuf95@users.noreply.github.com> Date: Mon, 27 Jun 2022 16:09:27 +0300 Subject: [PATCH 2/4] test(next): check if middleware has an effect on API endpoints requests --- .../app/middleware.js | 5 ++ .../app/pages/api/index.js | 20 +++++++ .../app/pages/api/post.js | 12 +++++ .../test/index.test.ts | 53 +++++++++++++++++++ 4 files changed, 90 insertions(+) create mode 100644 test/e2e/proxy-request-with-middleware/app/middleware.js create mode 100644 test/e2e/proxy-request-with-middleware/app/pages/api/index.js create mode 100644 test/e2e/proxy-request-with-middleware/app/pages/api/post.js create mode 100644 test/e2e/proxy-request-with-middleware/test/index.test.ts diff --git a/test/e2e/proxy-request-with-middleware/app/middleware.js b/test/e2e/proxy-request-with-middleware/app/middleware.js new file mode 100644 index 0000000000000..e045282b9f3c7 --- /dev/null +++ b/test/e2e/proxy-request-with-middleware/app/middleware.js @@ -0,0 +1,5 @@ +import { NextResponse } from 'next/server' + +export async function middleware() { + return NextResponse.next() +} diff --git a/test/e2e/proxy-request-with-middleware/app/pages/api/index.js b/test/e2e/proxy-request-with-middleware/app/pages/api/index.js new file mode 100644 index 0000000000000..fd4aa9d45e18a --- /dev/null +++ b/test/e2e/proxy-request-with-middleware/app/pages/api/index.js @@ -0,0 +1,20 @@ +import request from 'request' + +export const config = { + api: { + bodyParser: false, + }, +} + +export default function handler(req, res) { + return req + .pipe( + request(`http://${req.headers.host}${req.url}/post`, { + followAllRedirects: false, + followRedirect: false, + gzip: true, + json: false, + }) + ) + .pipe(res) +} diff --git a/test/e2e/proxy-request-with-middleware/app/pages/api/post.js b/test/e2e/proxy-request-with-middleware/app/pages/api/post.js new file mode 100644 index 0000000000000..172130f449e9e --- /dev/null +++ b/test/e2e/proxy-request-with-middleware/app/pages/api/post.js @@ -0,0 +1,12 @@ +export const config = { + api: { + bodyParser: false, + }, +} + +export default function handler(req, res) { + return res.json({ + method: req.method, + headers: req.headers, + }) +} diff --git a/test/e2e/proxy-request-with-middleware/test/index.test.ts b/test/e2e/proxy-request-with-middleware/test/index.test.ts new file mode 100644 index 0000000000000..cd8bd9eb8345c --- /dev/null +++ b/test/e2e/proxy-request-with-middleware/test/index.test.ts @@ -0,0 +1,53 @@ +/* eslint-env jest */ + +import { join } from 'path' +import { fetchViaHTTP } from 'next-test-utils' +import { NextInstance } from 'test/lib/next-modes/base' +import { createNext, FileRef } from 'e2e-utils' + +describe('Requests not effected when middleware used', () => { + let next: NextInstance + + afterAll(() => next.destroy()) + beforeAll(async () => { + next = await createNext({ + files: { + pages: new FileRef(join(__dirname, '../app/pages')), + 'middleware.js': new FileRef(join(__dirname, '../app/middleware.js')), + }, + dependencies: { + request: '^2.88.2', + }, + }) + }) + + sendRequest('GET') + sendRequest('POST') + + function sendRequest(method) { + const body = !['get', 'head'].includes(method.toLowerCase()) + ? JSON.stringify({ + key: 'value', + }) + : undefined + it(`should proxy ${method} request ${ + body ? 'with body' : '' + }`, async () => { + const headers = { + 'Content-Type': 'application/json', + 'x-custom-header': 'some value', + } + const res = await fetchViaHTTP(next.url, `api`, '', { + method: method.toUpperCase(), + headers, + body: method.toLowerCase() !== 'get' ? body : undefined, + }) + const data = await res.json() + expect(data.method).toEqual(method) + if (body) { + expect(data.headers['content-length']).toEqual(String(body.length)) + } + expect(data.headers).toEqual(expect.objectContaining(headers)) + }) + } +}) From f573c4a7dbe911d2f3fc5aeceb2c159d1a4b7f85 Mon Sep 17 00:00:00 2001 From: JJ Kasper Date: Mon, 27 Jun 2022 14:22:53 -0500 Subject: [PATCH 3/4] update test --- test/e2e/proxy-request-with-middleware/test/index.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/e2e/proxy-request-with-middleware/test/index.test.ts b/test/e2e/proxy-request-with-middleware/test/index.test.ts index cd8bd9eb8345c..0b47e9d7d5932 100644 --- a/test/e2e/proxy-request-with-middleware/test/index.test.ts +++ b/test/e2e/proxy-request-with-middleware/test/index.test.ts @@ -34,7 +34,7 @@ describe('Requests not effected when middleware used', () => { body ? 'with body' : '' }`, async () => { const headers = { - 'Content-Type': 'application/json', + 'content-type': 'application/json', 'x-custom-header': 'some value', } const res = await fetchViaHTTP(next.url, `api`, '', { From 92502ce7febc0caf6f221f1abae8fb558b7c0708 Mon Sep 17 00:00:00 2001 From: JJ Kasper Date: Mon, 27 Jun 2022 15:27:37 -0500 Subject: [PATCH 4/4] update test for node v18 --- .../app/pages/api/index.js | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/test/e2e/proxy-request-with-middleware/app/pages/api/index.js b/test/e2e/proxy-request-with-middleware/app/pages/api/index.js index fd4aa9d45e18a..01c9f6d808a87 100644 --- a/test/e2e/proxy-request-with-middleware/app/pages/api/index.js +++ b/test/e2e/proxy-request-with-middleware/app/pages/api/index.js @@ -9,12 +9,20 @@ export const config = { export default function handler(req, res) { return req .pipe( - request(`http://${req.headers.host}${req.url}/post`, { - followAllRedirects: false, - followRedirect: false, - gzip: true, - json: false, - }) + request( + `http://${ + // node v18 resolves to IPv6 by default so force IPv4 + process.version.startsWith('v18.') + ? `127.0.0.1:${req.headers.host.split(':').pop() || ''}` + : req.headers.host + }${req.url}/post`, + { + followAllRedirects: false, + followRedirect: false, + gzip: true, + json: false, + } + ) ) .pipe(res) }