Skip to content

Commit 71c4d73

Browse files
authored
add pipe support for wpt server (#3228)
1 parent 60efbf0 commit 71c4d73

11 files changed

+348
-19
lines changed

test/wpt/runner/runner.mjs

+3
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,9 @@ export class WPTRunner extends EventEmitter {
191191
}
192192
})
193193

194+
worker.stdout.pipe(process.stdout)
195+
worker.stderr.pipe(process.stderr)
196+
194197
const fileUrl = new URL(`/${this.#folderName}${test.slice(this.#folderPath.length)}`, 'http://wpt')
195198
fileUrl.pathname = fileUrl.pathname.replace(/\.js$/, '.html')
196199
fileUrl.search = variant

test/wpt/server/constants.mjs

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export const symbols = {
2+
kContent: Symbol('content')
3+
}

test/wpt/server/server.mjs

+38-19
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import { createReadStream, readFileSync, existsSync } from 'node:fs'
77
import { setTimeout as sleep } from 'node:timers/promises'
88
import { route as networkPartitionRoute } from './routes/network-partition-key.mjs'
99
import { route as redirectRoute } from './routes/redirect.mjs'
10+
import { Pipeline } from './util.mjs'
11+
import { symbols } from './constants.mjs'
1012

1113
const tests = fileURLToPath(join(import.meta.url, '../../tests'))
1214

@@ -31,6 +33,11 @@ const stash = new Stash()
3133
const server = createServer(async (req, res) => {
3234
const fullUrl = new URL(req.url, `http://localhost:${server.address().port}`)
3335

36+
if (fullUrl.searchParams.has('pipe')) {
37+
const pipe = new Pipeline(fullUrl.searchParams.get('pipe'))
38+
res = await pipe.call(req, res)
39+
}
40+
3441
switch (fullUrl.pathname) {
3542
case '/service-workers/cache-storage/resources/blank.html': {
3643
res.setHeader('content-type', 'text/html')
@@ -55,7 +62,8 @@ const server = createServer(async (req, res) => {
5562
case '/fetch/data-urls/resources/base64.json':
5663
case '/fetch/data-urls/resources/data-urls.json':
5764
case '/fetch/api/resources/empty.txt':
58-
case '/fetch/api/resources/data.json': {
65+
case '/fetch/api/resources/data.json':
66+
case '/common/text-plain.txt': {
5967
// If this specific resources requires custom headers
6068
const customHeadersPath = join(tests, fullUrl.pathname + '.headers')
6169
if (existsSync(customHeadersPath)) {
@@ -74,9 +82,11 @@ const server = createServer(async (req, res) => {
7482
}
7583

7684
// https://github.com/web-platform-tests/wpt/blob/6ae3f702a332e8399fab778c831db6b7dca3f1c6/fetch/api/resources/data.json
77-
return createReadStream(join(tests, fullUrl.pathname))
85+
createReadStream(join(tests, fullUrl.pathname))
7886
.on('end', () => res.end())
7987
.pipe(res)
88+
89+
break
8090
}
8191
case '/fetch/api/resources/trickle.py': {
8292
// Note: python's time.sleep(...) takes seconds, while setTimeout
@@ -133,7 +143,7 @@ const server = createServer(async (req, res) => {
133143
}
134144

135145
res.end()
136-
return
146+
break
137147
}
138148
case '/fetch/api/resources/stash-take.py': {
139149
// https://github.com/web-platform-tests/wpt/blob/6ae3f702a332e8399fab778c831db6b7dca3f1c6/fetch/api/resources/stash-take.py
@@ -144,7 +154,8 @@ const server = createServer(async (req, res) => {
144154
const took = stash.take(key, fullUrl.pathname) ?? null
145155

146156
res.write(JSON.stringify(took))
147-
return res.end()
157+
res.end()
158+
break
148159
}
149160
case '/fetch/api/resources/echo-content.py': {
150161
res.setHeader('X-Request-Method', req.method)
@@ -268,15 +279,19 @@ const server = createServer(async (req, res) => {
268279
break
269280
}
270281
case '/fetch/connection-pool/resources/network-partition-key.py': {
271-
return networkPartitionRoute(req, res, fullUrl)
282+
networkPartitionRoute(req, res, fullUrl)
283+
break
272284
}
273285
case '/resources/top.txt': {
274-
return createReadStream(join(tests, 'fetch/api/', fullUrl.pathname))
286+
createReadStream(join(tests, 'fetch/api/', fullUrl.pathname))
275287
.on('end', () => res.end())
276288
.pipe(res)
289+
290+
break
277291
}
278292
case '/fetch/api/resources/redirect.py': {
279-
return redirectRoute(req, res, fullUrl)
293+
redirectRoute(req, res, fullUrl)
294+
break
280295
}
281296
case '/fetch/api/resources/method.py': {
282297
if (fullUrl.searchParams.has('cors')) {
@@ -299,7 +314,7 @@ const server = createServer(async (req, res) => {
299314
}
300315

301316
res.end()
302-
return
317+
break
303318
}
304319
case '/fetch/api/resources/clean-stash.py': {
305320
const token = fullUrl.searchParams.get('token')
@@ -334,7 +349,7 @@ const server = createServer(async (req, res) => {
334349

335350
if (req.headers.authorization) {
336351
res.end(req.headers.authorization)
337-
return
352+
break
338353
}
339354

340355
res.end('none')
@@ -363,48 +378,48 @@ const server = createServer(async (req, res) => {
363378

364379
if (user === 'user' && password === 'password') {
365380
res.end('Authentication done')
366-
return
381+
break
367382
}
368383

369384
const realm = fullUrl.searchParams.get('realm') ?? 'test'
370385

371386
res.statusCode = 401
372387
res.setHeader('WWW-Authenticate', `Basic realm="${realm}"`)
373388
res.end('Please login with credentials \'user\' and \'password\'')
374-
return
389+
break
375390
}
376391
case '/fetch/api/resources/redirect-empty-location.py': {
377392
res.setHeader('location', '')
378393
res.statusCode = 302
379394
res.end('')
380-
return
395+
break
381396
}
382397
case '/service-workers/cache-storage/resources/fetch-status.py': {
383398
const status = Number(fullUrl.searchParams.get('status'))
384399

385400
res.statusCode = status
386401
res.end()
387-
return
402+
break
388403
}
389404
case '/service-workers/cache-storage/this-resource-should-not-exist':
390405
case '/service-workers/cache-storage/this-does-not-exist-please-dont-create-it': {
391406
res.statusCode = 404
392407
res.end()
393-
return
408+
break
394409
}
395410
case '/service-workers/cache-storage/resources/vary.py': {
396411
if (fullUrl.searchParams.has('clear-vary-value-override-cookie')) {
397412
res.setHeader('cookie', '')
398413
res.end('vary cookie cleared')
399-
return
414+
break
400415
}
401416

402417
const setCookieVary = fullUrl.searchParams.get('set-vary-value-override-cookie') ?? ''
403418

404419
if (setCookieVary) {
405420
res.setHeader('set-cookie', `vary-value-override=${setCookieVary}`)
406421
res.end('vary cookie set')
407-
return
422+
break
408423
}
409424

410425
const cookieVary = req.headers.cookie?.split(';').find((c) => c.includes('vary-value-override='))
@@ -420,7 +435,7 @@ const server = createServer(async (req, res) => {
420435
}
421436

422437
res.end('vary response')
423-
return
438+
break
424439
}
425440
case '/eventsource/resources/message.py': {
426441
const mime = fullUrl.searchParams.get('mime') ?? 'text/event-stream'
@@ -435,7 +450,7 @@ const server = createServer(async (req, res) => {
435450
res.end()
436451
}, sleep)
437452

438-
return
453+
break
439454
}
440455
case '/eventsource/resources/last-event-id.py': {
441456
const lastEventId = req.headers['Last-Event-ID'] ?? ''
@@ -451,13 +466,17 @@ const server = createServer(async (req, res) => {
451466
res.end()
452467
}
453468

454-
return
469+
break
455470
}
456471
default: {
457472
res.statusCode = 200
458473
res.end(fullUrl.toString())
459474
}
460475
}
476+
477+
if (res[symbols.kContent]) {
478+
res.write(res[symbols.kContent])
479+
}
461480
}).listen(0)
462481

463482
await once(server, 'listening')

0 commit comments

Comments
 (0)