http2: use 'close' event instead of 'streamClosed'

PR-URL: https://github.com/nodejs/node/pull/17328
Fixes: https://github.com/nodejs/node/issues/15303
Reviewed-By: Anatoli Papirovski <apapirovski@mac.com>
Reviewed-By: Sebastiaan Deckers <sebdeckers83@gmail.com>
This commit is contained in:
James M Snell 2017-11-25 13:02:16 -08:00
parent df33d8d0b3
commit 1b99542ea4
25 changed files with 45 additions and 47 deletions

View File

@ -633,7 +633,7 @@ All [`Http2Stream`][] instances are destroyed either when:
When an `Http2Stream` instance is destroyed, an attempt will be made to send an
`RST_STREAM` frame will be sent to the connected peer.
Once the `Http2Stream` instance is destroyed, the `'streamClosed'` event will
When the `Http2Stream` instance is destroyed, the `'close'` event will
be emitted. Because `Http2Stream` is an instance of `stream.Duplex`, the
`'end'` event will also be emitted if the stream data is currently flowing.
The `'error'` event may also be emitted if `http2stream.destroy()` was called
@ -655,6 +655,18 @@ abnormally aborted in mid-communication.
*Note*: The `'aborted'` event will only be emitted if the `Http2Stream`
writable side has not been ended.
#### Event: 'close'
<!-- YAML
added: v8.4.0
-->
The `'close'` event is emitted when the `Http2Stream` is destroyed. Once
this event is emitted, the `Http2Stream` instance is no longer usable.
The listener callback is passed a single argument specifying the HTTP/2 error
code specified when closing the stream. If the code is any value other than
`NGHTTP2_NO_ERROR` (`0`), an `'error'` event will also be emitted.
#### Event: 'error'
<!-- YAML
added: v8.4.0
@ -674,18 +686,6 @@ argument identifying the frame type, and an integer argument identifying the
error code. The `Http2Stream` instance will be destroyed immediately after the
`'frameError'` event is emitted.
#### Event: 'streamClosed'
<!-- YAML
added: v8.4.0
-->
The `'streamClosed'` event is emitted when the `Http2Stream` is destroyed. Once
this event is emitted, the `Http2Stream` instance is no longer usable.
The listener callback is passed a single argument specifying the HTTP/2 error
code specified when closing the stream. If the code is any value other than
`NGHTTP2_NO_ERROR` (`0`), an `'error'` event will also be emitted.
#### Event: 'timeout'
<!-- YAML
added: v8.4.0

View File

@ -250,7 +250,7 @@ class Http2ServerRequest extends Readable {
stream.on('close', onStreamClosedRequest);
stream.on('aborted', onStreamAbortedRequest);
const onfinish = this[kFinish].bind(this);
stream.on('streamClosed', onfinish);
stream.on('close', onfinish);
stream.on('finish', onfinish);
this.on('pause', onRequestPause);
this.on('resume', onRequestResume);
@ -383,7 +383,7 @@ class Http2ServerResponse extends Stream {
stream.on('close', onStreamClosedResponse);
stream.on('aborted', onStreamAbortedResponse);
const onfinish = this[kFinish].bind(this);
stream.on('streamClosed', onfinish);
stream.on('close', onfinish);
stream.on('finish', onfinish);
}

View File

@ -226,10 +226,8 @@ function onStreamTrailers() {
return headersList;
}
// Called when the stream is closed. The streamClosed event is emitted on the
// Http2Stream instance. Note that this event is distinctly different than the
// require('stream') interface 'close' event which deals with the state of the
// Readable and Writable sides of the Duplex.
// Called when the stream is closed. The close event is emitted on the
// Http2Stream instance
function onStreamClose(code) {
const stream = this[kOwner];
stream[kUpdateTimer]();
@ -1485,7 +1483,7 @@ function continueStreamDestroy(err, callback) {
abort(this);
this.push(null); // Close the readable side
this.end(); // Close the writable side
process.nextTick(emit, this, 'streamClosed', code);
process.nextTick(emit, this, 'close', code);
}
function finishStreamDestroy() {

View File

@ -13,7 +13,7 @@ server.listen(0, common.mustCall(() => {
const client = http2.connect(`http://localhost:${server.address().port}`);
const req = client.request();
req.on('streamClosed', common.mustCall());
req.on('close', common.mustCall());
client.on('error', common.expectsError({
code: 'ERR_HTTP2_ERROR',

View File

@ -27,7 +27,7 @@ server.on('listening', common.mustCall(() => {
// second call doesn't do anything
assert.doesNotThrow(() => req.rstStream(8));
req.on('streamClosed', common.mustCall((code) => {
req.on('close', common.mustCall((code) => {
assert.strictEqual(req.destroyed, true);
assert.strictEqual(code, 0);
server.close();

View File

@ -41,7 +41,7 @@ server.on('listening', common.mustCall(() => {
})(err);
}));
req.on('streamClosed', common.mustCall((code) => {
req.on('close', common.mustCall((code) => {
assert.strictEqual(req.rstCode, NGHTTP2_INTERNAL_ERROR);
assert.strictEqual(code, NGHTTP2_INTERNAL_ERROR);
server.close();

View File

@ -30,7 +30,7 @@ server.listen(0, common.mustCall(() => {
type: Error,
message: 'Stream closed with error code 1'
}));
req.on('streamClosed', common.mustCall(maybeClose));
req.on('close', common.mustCall(maybeClose));
}
for (let i = 0; i <= count; i += 1)

View File

@ -183,10 +183,10 @@ const {
{
// Should be able to call .end with cb from stream 'streamClosed'
// Should be able to call .end with cb from stream 'close'
const server = createServer(mustCall((request, response) => {
response.writeHead(HTTP_STATUS_OK, { foo: 'bar' });
response.stream.on('streamClosed', mustCall(() => {
response.stream.on('close', mustCall(() => {
response.end(mustCall());
}));
}));

View File

@ -63,8 +63,8 @@ server.on('request', common.mustCall(function(request, response) {
assert.strictEqual(request.socket.connecting, false);
// socket events are bound and emitted on Http2Stream
request.socket.on('streamClosed', common.mustCall());
request.socket.once('streamClosed', common.mustCall());
request.socket.on('close', common.mustCall());
request.socket.once('close', common.mustCall());
request.socket.on('testEvent', common.mustCall());
request.socket.emit('testEvent');
}));

View File

@ -42,7 +42,7 @@ server.on('stream', common.mustCall((stream, headers, flags, rawHeaders) => {
server.listen(0, common.mustCall(() => {
const client = http2.connect(`http://localhost:${server.address().port}`);
const req = client.request(src);
req.on('streamClosed', common.mustCall(() => {
req.on('close', common.mustCall(() => {
server.close();
client.destroy();
}));

View File

@ -54,7 +54,7 @@ server.listen(0, common.mustCall(() => {
const client = http2.connect(`http://localhost:${server.address().port}`);
const req = client.request(src);
req.on('response', common.mustCall(checkHeaders));
req.on('streamClosed', common.mustCall(() => {
req.on('close', common.mustCall(() => {
server.close();
client.destroy();
}));

View File

@ -34,7 +34,7 @@ server.on('stream', common.mustCall((stream) => {
pushedStream.respond({ ':status': 200 });
pushedStream.on('aborted', common.mustCall());
pushedStream.on('error', common.mustNotCall());
pushedStream.on('streamClosed',
pushedStream.on('close',
common.mustCall((code) => assert.strictEqual(code, 8)));
}));
@ -67,12 +67,12 @@ server.on('listening', common.mustCall(() => {
client.on('stream', common.mustCall((stream) => {
stream.resume();
stream.on('end', common.mustCall());
stream.on('streamClosed', common.mustCall(maybeClose));
stream.on('close', common.mustCall(maybeClose));
}));
req.on('response', common.mustCall());
req.resume();
req.on('end', common.mustCall());
req.on('streamClosed', common.mustCall(maybeClose));
req.on('close', common.mustCall(maybeClose));
}));

View File

@ -117,7 +117,7 @@ server.listen(0, common.mustCall(() => {
const client = http2.connect(`http://localhost:${server.address().port}`);
const req = client.request();
req.on('streamClosed', common.mustCall(() => {
req.on('close', common.mustCall(() => {
client.destroy();
server.close();
}));

View File

@ -144,7 +144,7 @@ server.listen(0, common.mustCall(() => {
const client = http2.connect(`http://localhost:${server.address().port}`);
const req = client.request();
req.on('streamClosed', common.mustCall(() => {
req.on('close', common.mustCall(() => {
client.destroy();
server.close();
}));

View File

@ -71,7 +71,7 @@ server.listen(0, () => {
req.on('end', common.mustCall(() => {
assert.strictEqual(check, data.toString('utf8', 8, 11));
}));
req.on('streamClosed', common.mustCall(maybeClose));
req.on('close', common.mustCall(maybeClose));
req.end();
}
@ -88,7 +88,7 @@ server.listen(0, () => {
req.on('end', common.mustCall(() => {
assert.strictEqual(check, data.toString('utf8', 8, 28));
}));
req.on('streamClosed', common.mustCall(maybeClose));
req.on('close', common.mustCall(maybeClose));
req.end();
}

View File

@ -13,7 +13,7 @@ const server = http2.createServer();
const status = [204, 205, 304];
server.on('stream', common.mustCall((stream) => {
stream.on('streamClosed', common.mustCall(() => {
stream.on('close', common.mustCall(() => {
assert.strictEqual(stream.destroyed, true);
}));
stream.respond({ ':status': status.shift() });

View File

@ -67,7 +67,7 @@ server.listen(0, common.mustCall(() => {
}));
req.resume();
req.on('end', common.mustCall());
req.on('streamClosed', common.mustCall(maybeClose));
req.on('close', common.mustCall(maybeClose));
}
doTest(str, 'location', str);

View File

@ -35,7 +35,7 @@ server.on('listening', common.mustCall(() => {
req.on('headers', common.mustNotCall());
req.on('streamClosed', common.mustCall((code) => {
req.on('close', common.mustCall((code) => {
assert.strictEqual(h2.constants.NGHTTP2_NO_ERROR, code);
server.close();
client.destroy();

View File

@ -43,7 +43,7 @@ server.listen(0, common.mustCall(() => {
':method': 'POST',
rstmethod: test[0]
});
req.on('streamClosed', common.mustCall((code) => {
req.on('close', common.mustCall((code) => {
assert.strictEqual(code, test[1]);
countdown.dec();
}));

View File

@ -49,7 +49,7 @@ server.listen(0, common.mustCall(() => {
const req = client.request();
req.resume();
req.on('end', common.mustCall());
req.on('streamClosed', common.mustCall(() => {
req.on('close', common.mustCall(() => {
client.destroy();
server.close();
}));

View File

@ -21,7 +21,7 @@ server.listen(0, common.mustCall(() => {
const client = http2.connect(`http://localhost:${server.address().port}`);
const req = client.request();
req.resume();
req.on('streamClosed', common.mustCall(() => {
req.on('close', common.mustCall(() => {
client.destroy();
server.close();
}));

View File

@ -11,7 +11,7 @@ let req;
const server = http2.createServer();
server.on('stream', common.mustCall((stream) => {
stream.on('error', common.mustCall(() => {
stream.on('streamClosed', common.mustCall((code) => {
stream.on('close', common.mustCall((code) => {
assert.strictEqual(code, 2);
client.destroy();
server.close();

View File

@ -22,7 +22,7 @@ server.listen(0, common.mustCall(() => {
type: Error,
message: 'Stream closed with error code 11'
}));
req.on('streamClosed', common.mustCall((code) => {
req.on('close', common.mustCall((code) => {
assert.strictEqual(code, NGHTTP2_ENHANCE_YOUR_CALM);
server.close();
client.destroy();

View File

@ -25,7 +25,7 @@ server.listen(0, common.mustCall(() => {
type: Error,
message: 'Stream closed with error code 11'
}));
req.on('streamClosed', common.mustCall((code) => {
req.on('close', common.mustCall((code) => {
assert.strictEqual(code, NGHTTP2_ENHANCE_YOUR_CALM);
server.close();
client.destroy();

View File

@ -30,7 +30,7 @@ server.listen(0, common.mustCall(() => {
req.setEncoding('utf8');
req.on('data', (chunk) => actual += chunk);
req.on('end', common.mustCall(() => assert.strictEqual(actual, 'abcxyz')));
req.on('streamClosed', common.mustCall(() => {
req.on('close', common.mustCall(() => {
client.destroy();
server.close();
}));