1'use strict';
2
3const common = require('../common');
4const events = require('events');
5const { createServer, request } = require('http');
6const assert = require('assert');
7
8events.captureRejections = true;
9
10{
11  const server = createServer(common.mustCall(async (req, res) => {
12    // We will test that this header is cleaned up before forwarding.
13    res.setHeader('content-type', 'application/json');
14    throw new Error('kaboom');
15  }));
16
17  server.listen(0, common.mustCall(() => {
18    const req = request({
19      method: 'GET',
20      host: server.address().host,
21      port: server.address().port
22    });
23
24    req.end();
25
26    req.on('response', common.mustCall((res) => {
27      assert.strictEqual(res.statusCode, 500);
28      assert.strictEqual(Object.hasOwn(res.headers, 'content-type'), false);
29      let data = '';
30      res.setEncoding('utf8');
31      res.on('data', common.mustCall((chunk) => {
32        data += chunk;
33      }));
34      res.on('end', common.mustCall(() => {
35        assert.strictEqual(data, 'Internal Server Error');
36        server.close();
37      }));
38    }));
39  }));
40}
41
42{
43  let resolve;
44  const latch = new Promise((_resolve) => {
45    resolve = _resolve;
46  });
47  const server = createServer(common.mustCall(async (req, res) => {
48    server.close();
49
50    // We will test that this header is cleaned up before forwarding.
51    res.setHeader('content-type', 'application/json');
52    res.write('{');
53    req.resume();
54
55    // Wait so the data is on the wire
56    await latch;
57
58    throw new Error('kaboom');
59  }));
60
61  server.listen(0, common.mustCall(() => {
62    const req = request({
63      method: 'GET',
64      host: server.address().host,
65      port: server.address().port
66    });
67
68    req.end();
69
70    req.on('response', common.mustCall((res) => {
71      assert.strictEqual(res.statusCode, 200);
72      assert.strictEqual(res.headers['content-type'], 'application/json');
73      resolve();
74
75      let data = '';
76      res.setEncoding('utf8');
77      res.on('data', common.mustCall((chunk) => {
78        data += chunk;
79      }));
80
81      req.on('close', common.mustCall(() => {
82        assert.strictEqual(data, '{');
83      }));
84    }));
85  }));
86}
87
88{
89  const server = createServer(common.mustCall(async (req, res) => {
90    // We will test that this header is cleaned up before forwarding.
91    res.writeHead(200);
92    throw new Error('kaboom');
93  }));
94
95  server.listen(0, common.mustCall(() => {
96    const req = request({
97      method: 'GET',
98      host: server.address().host,
99      port: server.address().port
100    });
101
102    req.end();
103    req.on('error', common.mustCall((err) => {
104      assert.strictEqual(err.code, 'ECONNRESET');
105      server.close();
106    }));
107  }));
108}
109