1'use strict';
2
3const common = require('../common');
4if (!common.hasCrypto)
5  common.skip('missing crypto');
6const assert = require('assert');
7const h2 = require('http2');
8
9// Http2ServerResponse.flushHeaders
10
11let serverResponse;
12
13const server = h2.createServer();
14server.listen(0, common.mustCall(function() {
15  const port = server.address().port;
16  server.once('request', common.mustCall(function(request, response) {
17    assert.strictEqual(response.headersSent, false);
18    assert.strictEqual(response._header, false); // Alias for headersSent
19    response.flushHeaders();
20    assert.strictEqual(response.headersSent, true);
21    assert.strictEqual(response._header, true);
22    response.flushHeaders(); // Idempotent
23
24    assert.throws(() => {
25      response.writeHead(400, { 'foo-bar': 'abc123' });
26    }, {
27      code: 'ERR_HTTP2_HEADERS_SENT'
28    });
29
30    response.on('finish', common.mustCall(function() {
31      server.close();
32      process.nextTick(() => {
33        response.flushHeaders(); // Idempotent
34      });
35    }));
36    serverResponse = response;
37  }));
38
39  const url = `http://localhost:${port}`;
40  const client = h2.connect(url, common.mustCall(function() {
41    const headers = {
42      ':path': '/',
43      ':method': 'GET',
44      ':scheme': 'http',
45      ':authority': `localhost:${port}`
46    };
47    const request = client.request(headers);
48    request.on('response', common.mustCall(function(headers, flags) {
49      assert.strictEqual(headers['foo-bar'], undefined);
50      assert.strictEqual(headers[':status'], 200);
51      serverResponse.end();
52    }, 1));
53    request.on('end', common.mustCall(function() {
54      client.close();
55    }));
56    request.end();
57    request.resume();
58  }));
59}));
60