Skip to content

Commit 7824fa0

Browse files
mcollinaaddaleax
authored andcommitted
http2: make writeHead behave like HTTP/1.
Backport-PR-URL: #14813 Backport-Reviewed-By: Anna Henningsen <[email protected]> Backport-Reviewed-By: Timothy Gu <[email protected]> PR-URL: #14239 Reviewed-By: Anna Henningsen <[email protected]> Reviewed-By: Colin Ihrig <[email protected]> Reviewed-By: Matteo Collina <[email protected]>
1 parent b778838 commit 7824fa0

5 files changed

+29
-34
lines changed

doc/api/http2.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -2402,7 +2402,7 @@ buffer. Returns `false` if all or part of the data was queued in user memory.
24022402
added: REPLACEME
24032403
-->
24042404

2405-
Does nothing. Added for parity with [HTTP/1]().
2405+
Throws an error as the `'continue'` flow is not current implemented. Added for parity with [HTTP/1]().
24062406

24072407
### response.writeHead(statusCode[, statusMessage][, headers])
24082408
<!-- YAML

lib/internal/http2/compat.js

+15-28
Original file line numberDiff line numberDiff line change
@@ -386,11 +386,6 @@ class Http2ServerResponse extends Stream {
386386
headers[name] = String(value);
387387
}
388388

389-
flushHeaders() {
390-
if (this[kStream].headersSent === false)
391-
this[kBeginSend]();
392-
}
393-
394389
get statusMessage() {
395390
if (statusMessageWarned === false) {
396391
process.emitWarning(
@@ -403,6 +398,11 @@ class Http2ServerResponse extends Stream {
403398
return '';
404399
}
405400

401+
flushHeaders() {
402+
if (this[kStream].headersSent === false)
403+
this[kBeginSend]();
404+
}
405+
406406
writeHead(statusCode, statusMessage, headers) {
407407
if (typeof statusMessage === 'string' && statusMessageWarned === false) {
408408
process.emitWarning(
@@ -414,6 +414,12 @@ class Http2ServerResponse extends Stream {
414414
if (headers === undefined && typeof statusMessage === 'object') {
415415
headers = statusMessage;
416416
}
417+
418+
const stream = this[kStream];
419+
if (stream.headersSent === true) {
420+
throw new errors.Error('ERR_HTTP2_INFO_HEADERS_AFTER_RESPOND');
421+
}
422+
417423
if (headers) {
418424
const keys = Object.keys(headers);
419425
let key = '';
@@ -422,8 +428,9 @@ class Http2ServerResponse extends Stream {
422428
this.setHeader(key, headers[key]);
423429
}
424430
}
431+
425432
this.statusCode = statusCode;
426-
// TODO mcollina this should probably call sendInfo
433+
this[kBeginSend]();
427434
}
428435

429436
write(chunk, encoding, cb) {
@@ -487,26 +494,6 @@ class Http2ServerResponse extends Stream {
487494
stream.setTimeout(msecs, callback);
488495
}
489496

490-
sendContinue(headers) {
491-
this.sendInfo(100, headers);
492-
}
493-
494-
sendInfo(code, headers) {
495-
const stream = this[kStream];
496-
if (stream.headersSent === true) {
497-
throw new errors.Error('ERR_HTTP2_INFO_HEADERS_AFTER_RESPOND');
498-
}
499-
if (headers && typeof headers !== 'object')
500-
throw new errors.TypeError('ERR_HTTP2_HEADERS_OBJECT');
501-
if (stream === undefined) return;
502-
code |= 0;
503-
if (code < 100 || code >= 200)
504-
throw new errors.RangeError('ERR_HTTP2_INVALID_INFO_STATUS', code);
505-
506-
headers[constants.HTTP2_HEADER_STATUS] = code;
507-
stream.respond(headers);
508-
}
509-
510497
createPushResponse(headers, callback) {
511498
const stream = this[kStream];
512499
if (stream === undefined) {
@@ -544,9 +531,9 @@ class Http2ServerResponse extends Stream {
544531
this.emit('finish');
545532
}
546533

547-
// added for parity with HTTP/1
548534
writeContinue() {
549-
// TODO mcollina this should probably be sendContinue
535+
// TODO mcollina check what is the continue flow
536+
throw new Error('not implemented yet');
550537
}
551538
}
552539

test/parallel/test-http2-compat-serverresponse-end.js

-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ const {
4646
const server = createServer(mustCall((request, response) => {
4747
strictEqual(response.finished, true);
4848
response.writeHead(HTTP_STATUS_OK, { foo: 'bar' });
49-
response.flushHeaders();
5049
response.end(mustNotCall());
5150
}));
5251
server.listen(0, mustCall(() => {

test/parallel/test-http2-compat-serverresponse-flushheaders.js

+9-2
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,24 @@ const h2 = require('http2');
77

88
// Http2ServerResponse.flushHeaders
99

10+
let serverResponse;
11+
1012
const server = h2.createServer();
1113
server.listen(0, common.mustCall(function() {
1214
const port = server.address().port;
1315
server.once('request', common.mustCall(function(request, response) {
1416
response.flushHeaders();
1517
response.flushHeaders(); // Idempotent
16-
response.writeHead(400, { 'foo-bar': 'abc123' }); // Ignored
18+
common.expectsError(() => {
19+
response.writeHead(400, { 'foo-bar': 'abc123' });
20+
}, {
21+
code: 'ERR_HTTP2_INFO_HEADERS_AFTER_RESPOND'
22+
});
1723

1824
response.on('finish', common.mustCall(function() {
1925
server.close();
2026
}));
21-
response.end();
27+
serverResponse = response;
2228
}));
2329

2430
const url = `http://localhost:${port}`;
@@ -33,6 +39,7 @@ server.listen(0, common.mustCall(function() {
3339
request.on('response', common.mustCall(function(headers, flags) {
3440
assert.strictEqual(headers['foo-bar'], undefined);
3541
assert.strictEqual(headers[':status'], 200);
42+
serverResponse.end();
3643
}, 1));
3744
request.on('end', common.mustCall(function() {
3845
client.destroy();

test/parallel/test-http2-compat-serverresponse-writehead.js

+4-2
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,13 @@ server.listen(0, common.mustCall(function() {
1212
const port = server.address().port;
1313
server.once('request', common.mustCall(function(request, response) {
1414
response.setHeader('foo-bar', 'def456');
15-
response.writeHead(500);
1615
response.writeHead(418, { 'foo-bar': 'abc123' }); // Override
1716

17+
common.expectsError(() => { response.writeHead(300); }, {
18+
code: 'ERR_HTTP2_INFO_HEADERS_AFTER_RESPOND'
19+
});
20+
1821
response.on('finish', common.mustCall(function() {
19-
assert.doesNotThrow(() => { response.writeHead(300); });
2022
server.close();
2123
}));
2224
response.end();

0 commit comments

Comments
 (0)