1'use strict';
2
3const common = require('../common');
4if (!common.hasCrypto)
5  common.skip('missing crypto');
6const assert = require('assert');
7const http2 = require('http2');
8
9// Http2ServerResponse.writeHead should support arrays and nested arrays
10
11{
12  const server = http2.createServer();
13  server.listen(0, common.mustCall(() => {
14    const port = server.address().port;
15
16    server.once('request', common.mustCall((request, response) => {
17      const returnVal = response.writeHead(200, [
18        ['foo', 'bar'],
19        ['ABC', 123],
20      ]);
21      assert.strictEqual(returnVal, response);
22      response.end(common.mustCall(() => { server.close(); }));
23    }));
24
25    const client = http2.connect(`http://localhost:${port}`, common.mustCall(() => {
26      const request = client.request();
27
28      request.on('response', common.mustCall((headers) => {
29        assert.strictEqual(headers.foo, 'bar');
30        assert.strictEqual(headers.abc, '123');
31        assert.strictEqual(headers[':status'], 200);
32      }, 1));
33      request.on('end', common.mustCall(() => {
34        client.close();
35      }));
36      request.end();
37      request.resume();
38    }));
39  }));
40}
41
42{
43  const server = http2.createServer();
44  server.listen(0, common.mustCall(() => {
45    const port = server.address().port;
46
47    server.once('request', common.mustCall((request, response) => {
48      const returnVal = response.writeHead(200, ['foo', 'bar', 'ABC', 123]);
49      assert.strictEqual(returnVal, response);
50      response.end(common.mustCall(() => { server.close(); }));
51    }));
52
53    const client = http2.connect(`http://localhost:${port}`, common.mustCall(() => {
54      const request = client.request();
55
56      request.on('response', common.mustCall((headers) => {
57        assert.strictEqual(headers.foo, 'bar');
58        assert.strictEqual(headers.abc, '123');
59        assert.strictEqual(headers[':status'], 200);
60      }, 1));
61      request.on('end', common.mustCall(() => {
62        client.close();
63      }));
64      request.end();
65      request.resume();
66    }));
67  }));
68}
69
70{
71  const server = http2.createServer();
72  server.listen(0, common.mustCall(() => {
73    const port = server.address().port;
74
75    server.once('request', common.mustCall((request, response) => {
76      try {
77        response.writeHead(200, ['foo', 'bar', 'ABC', 123, 'extra']);
78      } catch (err) {
79        assert.strictEqual(err.code, 'ERR_INVALID_ARG_VALUE');
80      }
81
82      response.end(common.mustCall(() => { server.close(); }));
83    }));
84
85    const client = http2.connect(`http://localhost:${port}`, common.mustCall(() => {
86      const request = client.request();
87
88      request.on('end', common.mustCall(() => {
89        client.close();
90      }));
91      request.end();
92      request.resume();
93    }));
94  }));
95}
96