diff --git a/lib/http.js b/lib/http.js index 356495f5b7..91a71808fb 100644 --- a/lib/http.js +++ b/lib/http.js @@ -1166,6 +1166,13 @@ Agent.prototype._establishNewConnection = function() { req.emit('error', err); req._hadError = true; // hacky + + // clean up so that agent can handle new requests + parser.finish(); + socket.destroy(); + self._removeSocket(socket); + parsers.free(parser); + self._cycle(); }); socket.ondata = function(d, start, end) { diff --git a/test/simple/test-http-dns-fail.js b/test/simple/test-http-dns-fail.js new file mode 100644 index 0000000000..3b8ebb9b5a --- /dev/null +++ b/test/simple/test-http-dns-fail.js @@ -0,0 +1,40 @@ +/* + * Repeated requests for a domain that fails to resolve + * should trigger the error event after each attempt. + */ + +var common = require('../common'); +var assert = require('assert'); +var http = require('http'); + +var resDespiteError = false +var hadError = 0 + +function httpreq(count) { + if ( 1 < count ) return + + var req = http.request({ + host:'not-a-real-domain-name.nobody-would-register-this-as-a-tld', + port: 80, + path: '/', + method: 'GET' + }, function(res) { + resDespiteError = true + }); + + req.on('error', function(e){ + console.log(e.message); + hadError++ + httpreq(count + 1) + }) + + req.end() +} + +httpreq(0) + + +process.on('exit', function() { + assert.equal(false, resDespiteError); + assert.equal(2, hadError); +});