'use strict';

const common = require('../common');
if (!common.hasCrypto)
  common.skip('missing crypto');

const assert = require('assert');
const http2 = require('http2');

for (const chunkSequence of [
  [ '' ],
  [ '', '' ]
]) {
  const server = http2.createServer();
  server.on('stream', common.mustCall((stream, headers, flags) => {
    stream.respond({ 'content-type': 'text/html' });

    let data = '';
    stream.on('data', common.mustNotCall((chunk) => {
      data += chunk.toString();
    }));
    stream.on('end', common.mustCall(() => {
      stream.end(`"${data}"`);
    }));
  }));

  server.listen(0, common.mustCall(() => {
    const port = server.address().port;
    const client = http2.connect(`http://localhost:${port}`);

    const req = client.request({
      ':method': 'POST',
      ':path': '/'
    });

    req.on('response', common.mustCall((headers) => {
      assert.strictEqual(headers[':status'], 200);
      assert.strictEqual(headers['content-type'], 'text/html');
    }));

    let data = '';
    req.setEncoding('utf8');
    req.on('data', common.mustCallAtLeast((d) => data += d));
    req.on('end', common.mustCall(() => {
      assert.strictEqual(data, '""');
      server.close();
      client.close();
    }));

    for (const chunk of chunkSequence)
      req.write(chunk);
    req.end();
  }));
}
