http2: fix no response event on continue request
When sending a continue request, server response with null, it does not fires the response event type Fixes: https://github.com/nodejs/node/issues/38258 PR-URL: https://github.com/nodejs/node/pull/41739 Refs: https://github.com/nodejs/node/pull/38561 Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com> Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com>
This commit is contained in:
parent
97826d3d83
commit
be6844d1ef
@ -394,8 +394,7 @@ function onSessionHeaders(handle, id, cat, flags, headers, sensitiveHeaders) {
|
||||
}
|
||||
} else if (cat === NGHTTP2_HCAT_PUSH_RESPONSE) {
|
||||
event = 'push';
|
||||
// cat === NGHTTP2_HCAT_HEADERS:
|
||||
} else if (!endOfStream && status !== undefined && status >= 200) {
|
||||
} else if (status !== undefined && status >= 200) {
|
||||
event = 'response';
|
||||
} else {
|
||||
event = endOfStream ? 'trailers' : 'headers';
|
||||
|
@ -6,49 +6,90 @@ if (!common.hasCrypto)
|
||||
const assert = require('assert');
|
||||
const http2 = require('http2');
|
||||
|
||||
const testResBody = 'other stuff!\n';
|
||||
{
|
||||
const testResBody = 'other stuff!\n';
|
||||
|
||||
// Checks the full 100-continue flow from client sending 'expect: 100-continue'
|
||||
// through server receiving it, sending back :status 100, writing the rest of
|
||||
// the request to finally the client receiving to.
|
||||
// Checks the full 100-continue flow from client sending 'expect: 100-continue'
|
||||
// through server receiving it, sending back :status 100, writing the rest of
|
||||
// the request to finally the client receiving to.
|
||||
|
||||
const server = http2.createServer();
|
||||
const server = http2.createServer();
|
||||
|
||||
let sentResponse = false;
|
||||
let sentResponse = false;
|
||||
|
||||
server.on('request', common.mustCall((req, res) => {
|
||||
res.end(testResBody);
|
||||
sentResponse = true;
|
||||
}));
|
||||
|
||||
server.listen(0);
|
||||
|
||||
server.on('listening', common.mustCall(() => {
|
||||
let body = '';
|
||||
|
||||
const client = http2.connect(`http://localhost:${server.address().port}`);
|
||||
const req = client.request({
|
||||
':method': 'POST',
|
||||
'expect': '100-continue'
|
||||
});
|
||||
|
||||
let gotContinue = false;
|
||||
req.on('continue', common.mustCall(() => {
|
||||
gotContinue = true;
|
||||
server.on('request', common.mustCall((req, res) => {
|
||||
res.end(testResBody);
|
||||
sentResponse = true;
|
||||
}));
|
||||
|
||||
req.on('response', common.mustCall((headers) => {
|
||||
assert.strictEqual(gotContinue, true);
|
||||
assert.strictEqual(sentResponse, true);
|
||||
assert.strictEqual(headers[':status'], 200);
|
||||
req.end();
|
||||
server.listen(0);
|
||||
|
||||
server.on('listening', common.mustCall(() => {
|
||||
let body = '';
|
||||
|
||||
const client = http2.connect(`http://localhost:${server.address().port}`);
|
||||
const req = client.request({
|
||||
':method': 'POST',
|
||||
'expect': '100-continue'
|
||||
});
|
||||
|
||||
let gotContinue = false;
|
||||
req.on('continue', common.mustCall(() => {
|
||||
gotContinue = true;
|
||||
}));
|
||||
|
||||
req.on('response', common.mustCall((headers) => {
|
||||
assert.strictEqual(gotContinue, true);
|
||||
assert.strictEqual(sentResponse, true);
|
||||
assert.strictEqual(headers[':status'], 200);
|
||||
req.end();
|
||||
}));
|
||||
|
||||
req.setEncoding('utf8');
|
||||
req.on('data', common.mustCall((chunk) => { body += chunk; }));
|
||||
req.on('end', common.mustCall(() => {
|
||||
assert.strictEqual(body, testResBody);
|
||||
client.close();
|
||||
server.close();
|
||||
}));
|
||||
}));
|
||||
}
|
||||
|
||||
{
|
||||
// Checks the full 100-continue flow from client sending 'expect: 100-continue'
|
||||
// through server receiving it and ending the request.
|
||||
|
||||
const server = http2.createServer();
|
||||
|
||||
server.on('request', common.mustCall((req, res) => {
|
||||
res.end();
|
||||
}));
|
||||
|
||||
req.setEncoding('utf8');
|
||||
req.on('data', common.mustCall((chunk) => { body += chunk; }));
|
||||
req.on('end', common.mustCall(() => {
|
||||
assert.strictEqual(body, testResBody);
|
||||
client.close();
|
||||
server.close();
|
||||
server.listen(0);
|
||||
|
||||
server.on('listening', common.mustCall(() => {
|
||||
const client = http2.connect(`http://localhost:${server.address().port}`);
|
||||
const req = client.request({
|
||||
':path': '/',
|
||||
'expect': '100-continue'
|
||||
});
|
||||
|
||||
let gotContinue = false;
|
||||
req.on('continue', common.mustCall(() => {
|
||||
gotContinue = true;
|
||||
}));
|
||||
|
||||
let gotResponse = false;
|
||||
req.on('response', common.mustCall(() => {
|
||||
gotResponse = true;
|
||||
}));
|
||||
|
||||
req.setEncoding('utf8');
|
||||
req.on('end', common.mustCall(() => {
|
||||
assert.strictEqual(gotContinue, true);
|
||||
assert.strictEqual(gotResponse, true);
|
||||
client.close();
|
||||
server.close();
|
||||
}));
|
||||
}));
|
||||
}));
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user