From ea9f5b110a2e41ff7bff2fa73a8847229a21a4ba Mon Sep 17 00:00:00 2001 From: Ryan Dahl Date: Thu, 24 Feb 2011 17:16:11 -0800 Subject: [PATCH] Add 'close' and 'aborted' events to Agent responses Closes GH-722. --- lib/http.js | 13 +++++--- test/simple/test-http-abort-client.js | 46 +++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 4 deletions(-) create mode 100644 test/simple/test-http-abort-client.js diff --git a/lib/http.js b/lib/http.js index 5e86a33f0da..bd0aec972cf 100644 --- a/lib/http.js +++ b/lib/http.js @@ -1235,10 +1235,15 @@ Agent.prototype._establishNewConnection = function() { // has a request but no response and it never emitted an error event: // THEN we need to trigger it manually. // There must be a better way to do this. - if (socket._httpMessage && - !socket._httpMessage.res && - !socket._httpMessage._hadError) { - socket._httpMessage.emit('error', new Error('socket hang up')); + if (socket._httpMessage) { + if (socket._httpMessage.res) { + socket._httpMessage.res.emit('aborted'); + socket._httpMessage.res.emit('close'); + } else { + if (!socket._httpMessage._hadError) { + socket._httpMessage.emit('error', new Error('socket hang up')); + } + } } self._removeSocket(socket); diff --git a/test/simple/test-http-abort-client.js b/test/simple/test-http-abort-client.js new file mode 100644 index 00000000000..e54a50631ea --- /dev/null +++ b/test/simple/test-http-abort-client.js @@ -0,0 +1,46 @@ +var common = require("../common"); +var http = require("http"); +var assert = require("assert"); + +var server = http.Server(function (req, res) { + console.log("Server accepted request."); + res.writeHead(200); + res.write("Part of my res."); + + res.destroy(); +}); + +var responseClose = false + +server.listen(common.PORT, function() { + var client = http.get({ + port: common.PORT, + headers: { connection: "keep-alive" } + + }, function(res) { + server.close(); + + console.log("Got res: " + res.statusCode); + console.dir(res.headers); + + res.on("data", function (chunk) { + console.log("Read " + chunk.length + " bytes"); + console.log(chunk.toString()); + }); + + res.on("end", function () { + console.log("Response ended."); + }); + + // it would be nice if this worked: + res.on("close", function () { + console.log("Response aborted"); + responseClose = true; + }); + }); +}); + + +process.on('exit', function() { + assert.ok(responseClose); +});