Skip to content

Commit d6484f3

Browse files
indutnyJulien Gilli
authored and
Julien Gilli
committed
http: fix assert on data/end after socket error
This change is a backport of 1a3ca82 from io.js. Original commit message: Read all pending data out of the socket on `error` event and ensure that no `data`/`end` handlers will be invoked on `socket.destroy()`. Otherwise following assertion happens: AssertionError: null == true at TLSSocket.socketOnData (_http_client.js:308:3) at TLSSocket.emit (events.js:107:17) at TLSSocket.Readable.read (_stream_readable.js:373:10) at TLSSocket.socketCloseListener (_http_client.js:229:10) at TLSSocket.emit (events.js:129:20) at TCP.close (net.js:476:12) Fix: nodejs/node-v0.x-archive#9348 PR-URL: #1103 Reviewed-By: Rod Vagg <[email protected]> Reviewed-By: Nicu Micleușanu <[email protected]> Fixes #9348. Reviewed-By: Julien Gilli <[email protected]> PR-URL: nodejs/node-v0.x-archive#14087
1 parent 2704c62 commit d6484f3

File tree

2 files changed

+50
-1
lines changed

2 files changed

+50
-1
lines changed

lib/_http_client.js

+8-1
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,6 @@ function socketCloseListener() {
264264

265265
function socketErrorListener(err) {
266266
var socket = this;
267-
var parser = socket.parser;
268267
var req = socket._httpMessage;
269268
debug('SOCKET ERROR:', err.message, err.stack);
270269

@@ -275,10 +274,18 @@ function socketErrorListener(err) {
275274
req.socket._hadError = true;
276275
}
277276

277+
// Handle any pending data
278+
socket.read();
279+
280+
var parser = socket.parser;
278281
if (parser) {
279282
parser.finish();
280283
freeParser(parser, req, socket);
281284
}
285+
286+
// Ensure that no further data will come out of the socket
287+
socket.removeListener('data', socketOnData);
288+
socket.removeListener('end', socketOnEnd);
282289
socket.destroy();
283290
}
284291

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
var net = require('net');
2+
var http = require('http');
3+
var util = require('util');
4+
5+
function Agent() {
6+
http.Agent.call(this);
7+
}
8+
util.inherits(Agent, http.Agent);
9+
10+
Agent.prototype.createConnection = function() {
11+
var self = this;
12+
var socket = new net.Socket();
13+
14+
socket.on('error', function() {
15+
socket.push('HTTP/1.1 200\r\n\r\n');
16+
});
17+
18+
socket.on('newListener', function onNewListener(name) {
19+
if (name !== 'error')
20+
return;
21+
socket.removeListener('newListener', onNewListener);
22+
23+
// Let other listeners to be set up too
24+
process.nextTick(function() {
25+
self.breakSocket(socket);
26+
});
27+
});
28+
29+
return socket;
30+
};
31+
32+
Agent.prototype.breakSocket = function breakSocket(socket) {
33+
socket.emit('error', new Error('Intentional error'));
34+
};
35+
36+
var agent = new Agent();
37+
38+
http.request({
39+
agent: agent
40+
}).once('error', function() {
41+
console.log('ignore');
42+
});

0 commit comments

Comments
 (0)