1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
'use strict'
const { createServer } = require('http')
const { test } = require('tap')
const { request } = require('..')
const { nodeMajor } = require('../lib/core/util')
function createPromise () {
const result = {}
result.promise = new Promise((resolve) => {
result.resolve = resolve
})
return result
}
test('should parse content-disposition consistently', { skip: nodeMajor >= 18 }, async (t) => {
t.plan(5)
// create promise to allow server spinup in parallel
const spinup1 = createPromise()
const spinup2 = createPromise()
const spinup3 = createPromise()
// variables to store content-disposition header
const header = []
const server = createServer((req, res) => {
res.writeHead(200, {
'content-length': 2,
'content-disposition': "attachment; filename='år.pdf'"
})
header.push("attachment; filename='år.pdf'")
res.end('OK', spinup1.resolve)
})
t.teardown(server.close.bind(server))
server.listen(0, spinup1.resolve)
const proxy1 = createServer(async (req, res) => {
const { statusCode, headers, body } = await request(`http://localhost:${server.address().port}`, {
method: 'GET'
})
header.push(headers['content-disposition'])
delete headers['transfer-encoding']
res.writeHead(statusCode, headers)
body.pipe(res)
})
t.teardown(proxy1.close.bind(proxy1))
proxy1.listen(0, spinup2.resolve)
const proxy2 = createServer(async (req, res) => {
const { statusCode, headers, body } = await request(`http://localhost:${proxy1.address().port}`, {
method: 'GET'
})
header.push(headers['content-disposition'])
delete headers['transfer-encoding']
res.writeHead(statusCode, headers)
body.pipe(res)
})
t.teardown(proxy2.close.bind(proxy2))
proxy2.listen(0, spinup3.resolve)
// wait until all server spinup
await Promise.all([spinup1.promise, spinup2.promise, spinup3.promise])
const { statusCode, headers, body } = await request(`http://localhost:${proxy2.address().port}`, {
method: 'GET'
})
header.push(headers['content-disposition'])
t.equal(statusCode, 200)
t.equal(await body.text(), 'OK')
// we check header
// must not be the same in first proxy
t.notSame(header[0], header[1])
// chaining always the same value
t.equal(header[1], header[2])
t.equal(header[2], header[3])
})
|