1'use strict';
2const common = require('../common');
3const http = require('http');
4const assert = require('assert');
5
6{
7  const server = http.createServer({ requireHostHeader: false }, common.mustCall((req, res) => {
8    res.writeHead(200); // Headers already sent
9    const headers = new globalThis.Headers({ foo: '1' });
10    assert.throws(() => {
11      res.setHeaders(headers);
12    }, {
13      code: 'ERR_HTTP_HEADERS_SENT'
14    });
15    res.end();
16  }));
17
18  server.listen(0, common.mustCall(() => {
19    http.get({ port: server.address().port }, (res) => {
20      assert.strictEqual(res.headers.foo, undefined);
21      res.resume().on('end', common.mustCall(() => {
22        server.close();
23      }));
24    });
25  }));
26}
27
28{
29  const server = http.createServer({ requireHostHeader: false }, common.mustCall((req, res) => {
30    assert.throws(() => {
31      res.setHeaders(['foo', '1']);
32    }, {
33      code: 'ERR_INVALID_ARG_TYPE'
34    });
35    assert.throws(() => {
36      res.setHeaders({ foo: '1' });
37    }, {
38      code: 'ERR_INVALID_ARG_TYPE'
39    });
40    assert.throws(() => {
41      res.setHeaders(null);
42    }, {
43      code: 'ERR_INVALID_ARG_TYPE'
44    });
45    assert.throws(() => {
46      res.setHeaders(undefined);
47    }, {
48      code: 'ERR_INVALID_ARG_TYPE'
49    });
50    assert.throws(() => {
51      res.setHeaders('test');
52    }, {
53      code: 'ERR_INVALID_ARG_TYPE'
54    });
55    assert.throws(() => {
56      res.setHeaders(1);
57    }, {
58      code: 'ERR_INVALID_ARG_TYPE'
59    });
60    res.end();
61  }));
62
63  server.listen(0, common.mustCall(() => {
64    http.get({ port: server.address().port }, (res) => {
65      assert.strictEqual(res.headers.foo, undefined);
66      res.resume().on('end', common.mustCall(() => {
67        server.close();
68      }));
69    });
70  }));
71}
72
73{
74  const server = http.createServer({ requireHostHeader: false }, common.mustCall((req, res) => {
75    const headers = new globalThis.Headers({ foo: '1', bar: '2' });
76    res.setHeaders(headers);
77    res.writeHead(200);
78    res.end();
79  }));
80
81  server.listen(0, common.mustCall(() => {
82    http.get({ port: server.address().port }, (res) => {
83      assert.strictEqual(res.statusCode, 200);
84      assert.strictEqual(res.headers.foo, '1');
85      assert.strictEqual(res.headers.bar, '2');
86      res.resume().on('end', common.mustCall(() => {
87        server.close();
88      }));
89    });
90  }));
91}
92
93{
94  const server = http.createServer({ requireHostHeader: false }, common.mustCall((req, res) => {
95    const headers = new globalThis.Headers({ foo: '1', bar: '2' });
96    res.setHeaders(headers);
97    res.writeHead(200, ['foo', '3']);
98    res.end();
99  }));
100
101  server.listen(0, common.mustCall(() => {
102    http.get({ port: server.address().port }, (res) => {
103      assert.strictEqual(res.statusCode, 200);
104      assert.strictEqual(res.headers.foo, '3'); // Override by writeHead
105      assert.strictEqual(res.headers.bar, '2');
106      res.resume().on('end', common.mustCall(() => {
107        server.close();
108      }));
109    });
110  }));
111}
112
113{
114  const server = http.createServer({ requireHostHeader: false }, common.mustCall((req, res) => {
115    const headers = new Map([['foo', '1'], ['bar', '2']]);
116    res.setHeaders(headers);
117    res.writeHead(200);
118    res.end();
119  }));
120
121  server.listen(0, common.mustCall(() => {
122    http.get({ port: server.address().port }, (res) => {
123      assert.strictEqual(res.statusCode, 200);
124      assert.strictEqual(res.headers.foo, '1');
125      assert.strictEqual(res.headers.bar, '2');
126      res.resume().on('end', common.mustCall(() => {
127        server.close();
128      }));
129    });
130  }));
131}
132