summaryrefslogtreecommitdiffstats
path: root/test/issue-1903.js
blob: 76ac81ef21791a97901f9cbbd3c085a95fbfec45 (plain)
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])
})