http: emit abort event from ClientRequest
authorEvan Lucas <evanlucas@me.com>
Wed, 25 Feb 2015 00:11:11 +0000 (18:11 -0600)
committercjihrig <cjihrig@gmail.com>
Wed, 25 Feb 2015 21:40:31 +0000 (16:40 -0500)
ClientRequest will now emit an abort event the first time abort()
is called.

Semver: Minor
Fixes: https://github.com/joyent/node/issues/9278
PR-URL: https://github.com/iojs/io.js/pull/945
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: Chris Dickinson <christopher.s.dickinson@gmail.com>
doc/api/http.markdown
lib/_http_client.js
test/parallel/test-http-client-abort-event.js [new file with mode: 0644]

index f5811e4..49ad016 100644 (file)
@@ -859,6 +859,13 @@ Emitted when the server sends a '100 Continue' HTTP response, usually because
 the request contained 'Expect: 100-continue'. This is an instruction that
 the client should send the request body.
 
+### Event: 'abort'
+
+`function () { }`
+
+Emitted when the request has been aborted by the client. This event is only
+emitted on the first call to `abort()`.
+
 ### request.flush()
 
 Flush the request headers.
index b02ab66..5e722b4 100644 (file)
@@ -166,6 +166,12 @@ ClientRequest.prototype._implicitHeader = function() {
 };
 
 ClientRequest.prototype.abort = function() {
+  var self = this;
+  if (this.aborted === undefined) {
+    process.nextTick(function() {
+      self.emit('abort');
+    });
+  }
   // Mark as aborting so we can avoid sending queued request data
   // This is used as a truthy flag elsewhere. The use of Date.now is for
   // debugging purposes only.
diff --git a/test/parallel/test-http-client-abort-event.js b/test/parallel/test-http-client-abort-event.js
new file mode 100644 (file)
index 0000000..1549d06
--- /dev/null
@@ -0,0 +1,28 @@
+var assert = require('assert');
+var http = require('http');
+var common = require('../common');
+var server = http.createServer(function(req, res) {
+  res.end();
+});
+var count = 0;
+server.listen(common.PORT, function() {
+  var req = http.request({
+    port: common.PORT
+  }, function() {
+    assert(false, 'should not receive data');
+  });
+
+  req.on('abort', function() {
+    // should only be emitted once
+    count++;
+    server.close();
+  });
+
+  req.end();
+  req.abort();
+  req.abort();
+});
+
+process.on('exit', function() {
+  assert.equal(count, 1);
+})