Skip to content

Commit 334d4f6

Browse files
mcollinatargos
authored andcommitted
http: add captureRejection support to OutgoingMessage
PR-URL: #27867 Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Jeremiah Senkpiel <fishrock123@rocketmail.com> Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Michaël Zasso <targos@protonmail.com>
1 parent 33a6bf3 commit 334d4f6

2 files changed

Lines changed: 95 additions & 0 deletions

File tree

‎lib/_http_outgoing.js‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ const {
3232

3333
const{ getDefaultHighWaterMark }=require('internal/streams/state');
3434
constassert=require('internal/assert');
35+
constEE=require('events');
3536
constStream=require('stream');
3637
constinternalUtil=require('internal/util');
3738
const{ kOutHeaders, utcDate, kNeedDrain }=require('internal/http');
@@ -884,6 +885,11 @@ OutgoingMessage.prototype.pipe = function pipe() {
884885
this.emit('error',newERR_STREAM_CANNOT_PIPE());
885886
};
886887

888+
OutgoingMessage.prototype[EE.captureRejectionSymbol]=
889+
function(err,event){
890+
this.destroy(err);
891+
};
892+
887893
module.exports={
888894
OutgoingMessage
889895
};
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
'use strict';
2+
3+
constcommon=require('../common');
4+
constassert=require('assert');
5+
constevents=require('events');
6+
const{ createServer, request }=require('http');
7+
8+
events.captureRejections=true;
9+
10+
{
11+
constserver=createServer(common.mustCall((req,res)=>{
12+
const_err=newError('kaboom');
13+
res.on('drain',common.mustCall(async()=>{
14+
throw_err;
15+
}));
16+
17+
res.socket.on('error',common.mustCall((err)=>{
18+
assert.strictEqual(err,_err);
19+
}));
20+
21+
// Write until there is space in the buffer
22+
while(res.write('hello')){}
23+
}));
24+
25+
server.listen(0,common.mustCall(()=>{
26+
constreq=request({
27+
method: 'GET',
28+
host: server.address().host,
29+
port: server.address().port
30+
});
31+
32+
req.end();
33+
34+
req.on('response',common.mustCall((res)=>{
35+
res.on('aborted',common.mustCall());
36+
res.resume();
37+
server.close();
38+
}));
39+
}));
40+
}
41+
42+
{
43+
let_res;
44+
letshouldEnd=false;
45+
// Not using mustCall here, because it is OS-dependant.
46+
constserver=createServer((req,res)=>{
47+
// So that we cleanly stop
48+
_res=res;
49+
50+
if(shouldEnd){
51+
res.end();
52+
}
53+
});
54+
55+
server.listen(0,common.mustCall(()=>{
56+
const_err=newError('kaboom');
57+
58+
constreq=request({
59+
method: 'POST',
60+
host: server.address().host,
61+
port: server.address().port
62+
});
63+
64+
req.on('response',common.mustNotCall((res)=>{
65+
// So that we cleanly stop
66+
res.resume();
67+
server.close();
68+
}));
69+
70+
req.on('error',common.mustCall((err)=>{
71+
server.close();
72+
// On some variants of Windows, this can happen before
73+
// the server has received the request.
74+
if(_res){
75+
_res.end();
76+
}else{
77+
shouldEnd=true;
78+
}
79+
assert.strictEqual(err,_err);
80+
}));
81+
82+
req.on('drain',common.mustCall(async()=>{
83+
throw_err;
84+
}));
85+
86+
// Write until there is space in the buffer
87+
while(req.write('hello')){}
88+
}));
89+
}

0 commit comments

Comments
 (0)