Skip to content

Commit 05edc74

Browse files
committed
extract mutation logic into a function
and remove the body modification example
1 parent cda0f41 commit 05edc74

File tree

2 files changed

+19
-46
lines changed

2 files changed

+19
-46
lines changed

packages/next/server/next-server.ts

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1244,7 +1244,7 @@ export default class NextNodeServer extends BaseServer {
12441244
const method = (params.request.method || 'GET').toUpperCase()
12451245
let originalBody =
12461246
method !== 'GET' && method !== 'HEAD'
1247-
? requestToBodyStream(params.request.body)
1247+
? teeableStream(requestToBodyStream(params.request.body))
12481248
: undefined
12491249

12501250
for (const middleware of this.middleware || []) {
@@ -1255,12 +1255,7 @@ export default class NextNodeServer extends BaseServer {
12551255
}
12561256

12571257
await this.ensureMiddleware(middleware.page, middleware.ssr)
1258-
let currentBody: typeof originalBody = undefined
1259-
if (originalBody) {
1260-
const [body1, body2] = originalBody.tee()
1261-
originalBody = body1
1262-
currentBody = body2
1263-
}
1258+
const currentBody = originalBody?.duplicate()
12641259

12651260
const middlewareInfo = this.getMiddlewareInfo(middleware.page)
12661261

@@ -1290,12 +1285,7 @@ export default class NextNodeServer extends BaseServer {
12901285
})
12911286

12921287
for (let [key, value] of result.response.headers) {
1293-
// TODO: remove, or rethink if really needed
1294-
if (key === 'x-middleware-use-body' && value === '1') {
1295-
if (result.response.body) {
1296-
originalBody = result.response.body as any
1297-
}
1298-
} else if (key !== 'x-middleware-next') {
1288+
if (key !== 'x-middleware-next') {
12991289
allHeaders.append(key, value)
13001290
}
13011291
}
@@ -1373,3 +1363,19 @@ function requestToBodyStream(
13731363

13741364
return transform.readable
13751365
}
1366+
1367+
/**
1368+
* A simple utility to take an original stream and have
1369+
* an API to duplicate it without closing it or mutate any variables
1370+
*/
1371+
function teeableStream<T>(originalStream: ReadableStream<T>): {
1372+
duplicate(): ReadableStream<T>
1373+
} {
1374+
return {
1375+
duplicate() {
1376+
const [stream1, stream2] = originalStream.tee()
1377+
originalStream = stream1
1378+
return stream2
1379+
},
1380+
}
1381+
}

test/production/reading-request-body-in-middleware/index.test.ts

Lines changed: 0 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -36,17 +36,6 @@ describe('reading request body in middleware', () => {
3636
3737
if (request.nextUrl.searchParams.has("next")) {
3838
return NextResponse.next();
39-
} else if (request.nextUrl.searchParams.has("change")) {
40-
return new Response(JSON.stringify({
41-
...json,
42-
changeFromRoot: true,
43-
}), {
44-
status: 200,
45-
headers: {
46-
'x-middleware-next': '1',
47-
'x-middleware-use-body': '1',
48-
}
49-
});
5039
}
5140
5241
return new Response(JSON.stringify({
@@ -135,26 +124,4 @@ describe('reading request body in middleware', () => {
135124
root: false,
136125
})
137126
})
138-
139-
it('modifies the body (returns changeFromRoot: true)', async () => {
140-
const response = await fetchViaHTTP(
141-
next.url,
142-
'/nested/hello',
143-
{
144-
change: '1',
145-
},
146-
{
147-
method: 'POST',
148-
body: JSON.stringify({
149-
foo: 'bar',
150-
}),
151-
}
152-
)
153-
expect(response.status).toEqual(200)
154-
expect(await response.json()).toEqual({
155-
foo: 'bar',
156-
changeFromRoot: true,
157-
root: false,
158-
})
159-
})
160127
})

0 commit comments

Comments
 (0)