@@ -5,6 +5,29 @@ import { createNext, FileRef } from 'e2e-utils'
5
5
import { NextInstance } from 'e2e-utils'
6
6
import { fetchViaHTTP , findPort , retry } from 'next-test-utils'
7
7
8
+ async function createHostServer ( ) {
9
+ const server = http . createServer ( ( req , res ) => {
10
+ res . end ( `
11
+ <html>
12
+ <head>
13
+ <title>testing cross-site</title>
14
+ </head>
15
+ <body></body>
16
+ </html>
17
+ ` )
18
+ } )
19
+
20
+ const port = await findPort ( )
21
+ await new Promise < void > ( ( res ) => {
22
+ server . listen ( port , ( ) => res ( ) )
23
+ } )
24
+
25
+ return {
26
+ server,
27
+ port,
28
+ }
29
+ }
30
+
8
31
describe . each ( [ [ '' , '/docs' ] ] ) (
9
32
'allowed-dev-origins, basePath: %p' ,
10
33
( basePath : string ) => {
@@ -34,21 +57,8 @@ describe.each([['', '/docs']])(
34
57
afterAll ( ( ) => next . destroy ( ) )
35
58
36
59
it ( 'should warn about WebSocket from cross-site' , async ( ) => {
37
- let server = http . createServer ( ( req , res ) => {
38
- res . end ( `
39
- <html>
40
- <head>
41
- <title>testing cross-site</title>
42
- </head>
43
- <body></body>
44
- </html>
45
- ` )
46
- } )
60
+ const { server, port } = await createHostServer ( )
47
61
try {
48
- const port = await findPort ( )
49
- await new Promise < void > ( ( res ) => {
50
- server . listen ( port , ( ) => res ( ) )
51
- } )
52
62
const websocketSnippet = `(() => {
53
63
const statusEl = document.createElement('p')
54
64
statusEl.id = 'status'
@@ -88,22 +98,10 @@ describe.each([['', '/docs']])(
88
98
}
89
99
} )
90
100
91
- it ( 'should not allow loading scripts from cross-site' , async ( ) => {
92
- let server = http . createServer ( ( req , res ) => {
93
- res . end ( `
94
- <html>
95
- <head>
96
- <title>testing cross-site</title>
97
- </head>
98
- <body></body>
99
- </html>
100
- ` )
101
- } )
101
+ it ( 'should warn about loading scripts from cross-site' , async ( ) => {
102
+ const { server, port } = await createHostServer ( )
103
+
102
104
try {
103
- const port = await findPort ( )
104
- await new Promise < void > ( ( res ) => {
105
- server . listen ( port , ( ) => res ( ) )
106
- } )
107
105
const scriptSnippet = `(() => {
108
106
const statusEl = document.createElement('p')
109
107
statusEl.id = 'status'
@@ -146,6 +144,46 @@ describe.each([['', '/docs']])(
146
144
server . close ( )
147
145
}
148
146
} )
147
+
148
+ it ( 'should warn about loading internal middleware from cross-site' , async ( ) => {
149
+ const { server, port } = await createHostServer ( )
150
+ try {
151
+ const browser = await webdriver ( `http://127.0.0.1:${ port } ` , '/about' )
152
+
153
+ const middlewareSnippet = `(() => {
154
+ const statusEl = document.createElement('p')
155
+ statusEl.id = 'status'
156
+ document.querySelector('body').appendChild(statusEl)
157
+
158
+ const xhr = new XMLHttpRequest()
159
+ xhr.open('GET', '${ next . url } /__nextjs_error_feedback?errorCode=0&wasHelpful=true', true)
160
+ xhr.send()
161
+
162
+ xhr.onload = () => {
163
+ statusEl.innerText = "OK"
164
+ }
165
+ xhr.onerror = () => {
166
+ statusEl.innerText = "Unauthorized"
167
+ }
168
+ })()`
169
+
170
+ await browser . eval ( middlewareSnippet )
171
+
172
+ await retry ( async ( ) => {
173
+ // TODO: These requests seem to be blocked regardless of our handling only when running with Turbopack
174
+ // Investigate why this is the case
175
+ if ( ! process . env . TURBOPACK ) {
176
+ expect ( await browser . elementByCss ( '#status' ) . text ( ) ) . toBe ( 'OK' )
177
+ }
178
+
179
+ expect ( next . cliOutput ) . toContain (
180
+ 'Cross origin request detected from'
181
+ )
182
+ } )
183
+ } finally {
184
+ server . close ( )
185
+ }
186
+ } )
149
187
} )
150
188
151
189
describe ( 'block mode' , ( ) => {
@@ -173,21 +211,8 @@ describe.each([['', '/docs']])(
173
211
afterAll ( ( ) => next . destroy ( ) )
174
212
175
213
it ( 'should not allow dev WebSocket from cross-site' , async ( ) => {
176
- let server = http . createServer ( ( req , res ) => {
177
- res . end ( `
178
- <html>
179
- <head>
180
- <title>testing cross-site</title>
181
- </head>
182
- <body></body>
183
- </html>
184
- ` )
185
- } )
214
+ const { server, port } = await createHostServer ( )
186
215
try {
187
- const port = await findPort ( )
188
- await new Promise < void > ( ( res ) => {
189
- server . listen ( port , ( ) => res ( ) )
190
- } )
191
216
const websocketSnippet = `(() => {
192
217
const statusEl = document.createElement('p')
193
218
statusEl.id = 'status'
@@ -222,21 +247,8 @@ describe.each([['', '/docs']])(
222
247
} )
223
248
224
249
it ( 'should not allow loading scripts from cross-site' , async ( ) => {
225
- let server = http . createServer ( ( req , res ) => {
226
- res . end ( `
227
- <html>
228
- <head>
229
- <title>testing cross-site</title>
230
- </head>
231
- <body></body>
232
- </html>
233
- ` )
234
- } )
250
+ const { server, port } = await createHostServer ( )
235
251
try {
236
- const port = await findPort ( )
237
- await new Promise < void > ( ( res ) => {
238
- server . listen ( port , ( ) => res ( ) )
239
- } )
240
252
const scriptSnippet = `(() => {
241
253
const statusEl = document.createElement('p')
242
254
statusEl.id = 'status'
@@ -272,6 +284,40 @@ describe.each([['', '/docs']])(
272
284
server . close ( )
273
285
}
274
286
} )
287
+
288
+ it ( 'should not allow loading internal middleware from cross-site' , async ( ) => {
289
+ const { server, port } = await createHostServer ( )
290
+ try {
291
+ const browser = await webdriver ( `http://127.0.0.1:${ port } ` , '/about' )
292
+
293
+ const middlewareSnippet = `(() => {
294
+ const statusEl = document.createElement('p')
295
+ statusEl.id = 'status'
296
+ document.querySelector('body').appendChild(statusEl)
297
+
298
+ const xhr = new XMLHttpRequest()
299
+ xhr.open('GET', '${ next . url } /__nextjs_error_feedback?errorCode=0&wasHelpful=true', true)
300
+ xhr.send()
301
+
302
+ xhr.onload = () => {
303
+ statusEl.innerText = "OK"
304
+ }
305
+ xhr.onerror = () => {
306
+ statusEl.innerText = "Unauthorized"
307
+ }
308
+ })()`
309
+
310
+ await browser . eval ( middlewareSnippet )
311
+
312
+ await retry ( async ( ) => {
313
+ expect ( await browser . elementByCss ( '#status' ) . text ( ) ) . toBe (
314
+ 'Unauthorized'
315
+ )
316
+ } )
317
+ } finally {
318
+ server . close ( )
319
+ }
320
+ } )
275
321
} )
276
322
}
277
323
)
0 commit comments