http: emit abort event from ClientRequest

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>
This commit is contained in:
Evan Lucas 2015-02-24 18:11:11 -06:00 committed by cjihrig
parent 89e133a1d8
commit 2ca22aacbd
3 changed files with 41 additions and 0 deletions

View 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 request contained 'Expect: 100-continue'. This is an instruction that
the client should send the request body. 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() ### request.flush()
Flush the request headers. Flush the request headers.

View File

@ -166,6 +166,12 @@ ClientRequest.prototype._implicitHeader = function() {
}; };
ClientRequest.prototype.abort = 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 // 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 // This is used as a truthy flag elsewhere. The use of Date.now is for
// debugging purposes only. // debugging purposes only.

View File

@ -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);
})