mirror of
https://github.com/nodejs/node.git
synced 2025-05-06 05:21:19 +00:00

PR-URL: https://github.com/nodejs/node/pull/17406 Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Anatoli Papirovski <apapirovski@mac.com> This is a significant cleanup and refactoring of the cleanup/close/destroy logic for Http2Stream and Http2Session. There are significant changes here in the timing and ordering of cleanup logic, JS apis. and various related necessary edits.
102 lines
2.4 KiB
JavaScript
102 lines
2.4 KiB
JavaScript
'use strict';
|
|
|
|
const common = require('../common');
|
|
if (!common.hasCrypto)
|
|
common.skip('missing crypto');
|
|
const fixtures = require('../common/fixtures');
|
|
const http2 = require('http2');
|
|
|
|
const optionsWithTypeError = {
|
|
offset: 'number',
|
|
length: 'number',
|
|
statCheck: 'function',
|
|
getTrailers: 'function'
|
|
};
|
|
|
|
const types = {
|
|
boolean: true,
|
|
function: () => {},
|
|
number: 1,
|
|
object: {},
|
|
array: [],
|
|
null: null,
|
|
symbol: Symbol('test')
|
|
};
|
|
|
|
const fname = fixtures.path('elipses.txt');
|
|
|
|
const server = http2.createServer();
|
|
|
|
server.on('stream', common.mustCall((stream) => {
|
|
|
|
// Check for all possible TypeError triggers on options
|
|
Object.keys(optionsWithTypeError).forEach((option) => {
|
|
Object.keys(types).forEach((type) => {
|
|
if (type === optionsWithTypeError[option]) {
|
|
return;
|
|
}
|
|
|
|
common.expectsError(
|
|
() => stream.respondWithFile(fname, {
|
|
'content-type': 'text/plain'
|
|
}, {
|
|
[option]: types[type]
|
|
}),
|
|
{
|
|
type: TypeError,
|
|
code: 'ERR_INVALID_OPT_VALUE',
|
|
message: `The value "${String(types[type])}" is invalid ` +
|
|
`for option "${option}"`
|
|
}
|
|
);
|
|
});
|
|
});
|
|
|
|
// Should throw if :status 204, 205 or 304
|
|
[204, 205, 304].forEach((status) => common.expectsError(
|
|
() => stream.respondWithFile(fname, {
|
|
'content-type': 'text/plain',
|
|
':status': status,
|
|
}),
|
|
{
|
|
code: 'ERR_HTTP2_PAYLOAD_FORBIDDEN',
|
|
message: `Responses with ${status} status must not have a payload`
|
|
}
|
|
));
|
|
|
|
// Should throw if headers already sent
|
|
stream.respond({ ':status': 200 });
|
|
common.expectsError(
|
|
() => stream.respondWithFile(fname, {
|
|
'content-type': 'text/plain'
|
|
}),
|
|
{
|
|
code: 'ERR_HTTP2_HEADERS_SENT',
|
|
message: 'Response has already been initiated.'
|
|
}
|
|
);
|
|
|
|
// Should throw if stream already destroyed
|
|
stream.destroy();
|
|
common.expectsError(
|
|
() => stream.respondWithFile(fname, {
|
|
'content-type': 'text/plain'
|
|
}),
|
|
{
|
|
code: 'ERR_HTTP2_INVALID_STREAM',
|
|
message: 'The stream has been destroyed'
|
|
}
|
|
);
|
|
}));
|
|
|
|
server.listen(0, common.mustCall(() => {
|
|
const client = http2.connect(`http://localhost:${server.address().port}`);
|
|
const req = client.request();
|
|
|
|
req.on('close', common.mustCall(() => {
|
|
client.close();
|
|
server.close();
|
|
}));
|
|
req.end();
|
|
}));
|