Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

http2: fix no response event on continue request #41739

Merged
merged 4 commits into from
Feb 3, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions lib/internal/http2/core.js
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down
107 changes: 74 additions & 33 deletions test/parallel/test-http2-compat-expect-continue.js
Original file line number Diff line number Diff line change
Expand Up @@ -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.on('request', common.mustCall((req, res) => {
res.end(testResBody);
sentResponse = true;
}));

server.listen(0);

server.on('listening', common.mustCall(() => {
let body = '';

server.listen(0);
const client = http2.connect(`http://localhost:${server.address().port}`);
const req = client.request({
':method': 'POST',
'expect': '100-continue'
});

server.on('listening', common.mustCall(() => {
let body = '';
let gotContinue = false;
req.on('continue', common.mustCall(() => {
gotContinue = true;
}));

const client = http2.connect(`http://localhost:${server.address().port}`);
const req = client.request({
':method': 'POST',
'expect': '100-continue'
});
req.on('response', common.mustCall((headers) => {
assert.strictEqual(gotContinue, true);
assert.strictEqual(sentResponse, true);
assert.strictEqual(headers[':status'], 200);
req.end();
}));

let gotContinue = false;
req.on('continue', common.mustCall(() => {
gotContinue = true;
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();

req.on('response', common.mustCall((headers) => {
assert.strictEqual(gotContinue, true);
assert.strictEqual(sentResponse, true);
assert.strictEqual(headers[':status'], 200);
req.end();
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();
}));
}));
}));
}