http: add req.signal to IncomingMessage · nodejs/node@aa1d8a9
1+'use strict';
2+3+const common = require('../common');
4+const assert = require('assert');
5+const http = require('http');
6+7+// Test 1: req.signal is an AbortSignal and aborts on 'close'
8+{
9+const server = http.createServer(common.mustCall((req, res) => {
10+assert.ok(req.signal instanceof AbortSignal);
11+assert.strictEqual(req.signal.aborted, false);
12+req.signal.onabort = common.mustCall(() => {
13+assert.strictEqual(req.signal.aborted, true);
14+});
15+res.destroy();
16+}));
17+server.listen(0, common.mustCall(() => {
18+http.get({ port: server.address().port }, () => {}).on('error', () => {
19+server.close();
20+});
21+}));
22+}
23+24+// Test 2: req.signal is aborted if accessed after destroy
25+{
26+const req = new http.IncomingMessage(null);
27+req.destroy();
28+assert.strictEqual(req.signal.aborted, true);
29+}
30+31+// Test 3: Multiple accesses return the same signal
32+{
33+const req = new http.IncomingMessage(null);
34+assert.strictEqual(req.signal, req.signal);
35+}
36+37+38+// Test 4: res.signal on a client-side http.request() response (IncomingMessage).
39+{
40+const server = http.createServer(common.mustCall((req, res) => {
41+res.writeHead(200);
42+res.write('partial');
43+}));
44+45+server.listen(0, common.mustCall(() => {
46+const clientReq = http.request(
47+{ port: server.address().port },
48+common.mustCall((res) => {
49+assert.ok(res.signal instanceof AbortSignal);
50+assert.strictEqual(res.signal.aborted, false);
51+52+res.signal.onabort = common.mustCall(() => {
53+assert.strictEqual(res.signal.aborted, true);
54+server.close();
55+});
56+clientReq.destroy();
57+}),
58+);
59+clientReq.on('error', () => {});
60+clientReq.end();
61+}));
62+}
63+64+// Test 5: Client cancels a pending request.
65+{
66+const server = http.createServer(common.mustCall((req, res) => {
67+req.signal.onabort = common.mustCall(() => {
68+assert.strictEqual(req.signal.aborted, true);
69+server.close();
70+});
71+res.flushHeaders();
72+}));
73+74+server.listen(0, common.mustCall(() => {
75+const clientReq = http.request(
76+{ port: server.address().port },
77+common.mustCall((res) => {
78+res.on('error', () => {});
79+clientReq.destroy();
80+}),
81+);
82+clientReq.on('error', () => {});
83+clientReq.end();
84+}));
85+}