◐ Shell
clean mode source ↗

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+

}