mirror of
https://github.com/nodejs/node.git
synced 2025-05-03 07:36:51 +00:00

It may happen that the data in `emptyframe.http2` reaches the client even before the client has started sending the request, causing an `ERR_HTTP2_STREAM_ERROR` instead. Fix this by making sure the frame is not sent until some data reaches the server. PR-URL: https://github.com/nodejs/node/pull/45212 Reviewed-By: Luigi Pinca <luigipinca@gmail.com> Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Mohammed Keyvanzadeh <mohammadkeyvanzade94@gmail.com> Reviewed-By: Juan José Arboleda <soyjuanarbol@gmail.com>
48 lines
1.3 KiB
JavaScript
48 lines
1.3 KiB
JavaScript
'use strict';
|
|
const common = require('../common');
|
|
if (!common.hasCrypto)
|
|
common.skip('missing crypto');
|
|
const { readSync } = require('../common/fixtures');
|
|
const net = require('net');
|
|
const http2 = require('http2');
|
|
const { once } = require('events');
|
|
|
|
async function main() {
|
|
const blobWithEmptyFrame = readSync('emptyframe.http2');
|
|
const server = net.createServer((socket) => {
|
|
socket.once('data', () => {
|
|
socket.end(blobWithEmptyFrame);
|
|
});
|
|
}).listen(0);
|
|
await once(server, 'listening');
|
|
|
|
for (const maxSessionInvalidFrames of [0, 2]) {
|
|
const client = http2.connect(`http://localhost:${server.address().port}`, {
|
|
maxSessionInvalidFrames
|
|
});
|
|
const stream = client.request({
|
|
':method': 'GET',
|
|
':path': '/'
|
|
});
|
|
if (maxSessionInvalidFrames) {
|
|
stream.on('error', common.mustNotCall());
|
|
client.on('error', common.mustNotCall());
|
|
} else {
|
|
const expected = {
|
|
code: 'ERR_HTTP2_TOO_MANY_INVALID_FRAMES',
|
|
message: 'Too many invalid HTTP/2 frames'
|
|
};
|
|
stream.on('error', common.expectsError(expected));
|
|
client.on('error', common.expectsError(expected));
|
|
}
|
|
stream.resume();
|
|
await new Promise((resolve) => {
|
|
stream.once('close', resolve);
|
|
});
|
|
client.close();
|
|
}
|
|
server.close();
|
|
}
|
|
|
|
main().then(common.mustCall());
|