Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 790864b

Browse filesBrowse files
jasnelltargos
authored andcommitted
http2: add http2stream.endAfterHeaders property
Indicates is the END_STREAM flag was set on the received HEADERS frame PR-URL: #22843 Fixes: #22497 Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Trivikram Kamat <trivikr.dev@gmail.com> Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
1 parent add1fcd commit 790864b
Copy full SHA for 790864b

File tree

Expand file treeCollapse file tree

3 files changed

+69
-1
lines changed
Open diff view settings
Filter options
Expand file treeCollapse file tree

3 files changed

+69
-1
lines changed
Open diff view settings
Collapse file

‎doc/api/http2.md‎

Copy file name to clipboardExpand all lines: doc/api/http2.md
+11Lines changed: 11 additions & 0 deletions
  • Display the source diff
  • Display the rich diff
Original file line numberDiff line numberDiff line change
@@ -958,6 +958,17 @@ added: v8.4.0
958958
Set to `true` if the `Http2Stream` instance has been destroyed and is no longer
959959
usable.
960960

961+
#### http2stream.endAfterHeaders
962+
<!-- YAML
963+
added: REPLACEME
964+
-->
965+
966+
* {boolean}
967+
968+
Set the `true` if the `END_STREAM` flag was set in the request or response
969+
HEADERS frame received, indicating that no additional data should be received
970+
and the readable side of the `Http2Stream` will be closed.
971+
961972
#### http2stream.pending
962973
<!-- YAML
963974
added: v9.4.0
Collapse file

‎lib/internal/http2/core.js‎

Copy file name to clipboardExpand all lines: lib/internal/http2/core.js
+8-1Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,8 @@ function onSessionHeaders(handle, id, cat, flags, headers) {
276276
} else {
277277
stream = new ClientHttp2Stream(session, handle, id, opts);
278278
}
279+
if (endOfStream)
280+
stream[kState].endAfterHeaders = true;
279281
process.nextTick(emit, session, 'stream', stream, obj, flags, headers);
280282
} else {
281283
let event;
@@ -1548,7 +1550,8 @@ class Http2Stream extends Duplex {
15481550
flags: STREAM_FLAGS_PENDING,
15491551
rstCode: NGHTTP2_NO_ERROR,
15501552
writeQueueSize: 0,
1551-
trailersReady: false
1553+
trailersReady: false,
1554+
endAfterHeaders: false
15521555
};
15531556

15541557
this.on('pause', streamOnPause);
@@ -1594,6 +1597,10 @@ class Http2Stream extends Duplex {
15941597
return `Http2Stream ${util.format(obj)}`;
15951598
}
15961599

1600+
get endAfterHeaders() {
1601+
return this[kState].endAfterHeaders;
1602+
}
1603+
15971604
get sentHeaders() {
15981605
return this[kSentHeaders];
15991606
}
Collapse file
+50Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
'use strict';
2+
3+
const common = require('../common');
4+
if (!common.hasCrypto)
5+
common.skip('missing crypto');
6+
const assert = require('assert');
7+
const http2 = require('http2');
8+
const Countdown = require('../common/countdown');
9+
10+
const server = http2.createServer();
11+
server.on('stream', common.mustCall((stream, headers) => {
12+
const check = headers[':method'] === 'GET' ? true : false;
13+
assert.strictEqual(stream.endAfterHeaders, check);
14+
stream.on('data', common.mustNotCall());
15+
stream.on('end', common.mustCall());
16+
stream.respond();
17+
stream.end('ok');
18+
}, 2));
19+
20+
const countdown = new Countdown(2, () => server.close());
21+
22+
server.listen(0, common.mustCall(() => {
23+
{
24+
const client = http2.connect(`http://localhost:${server.address().port}`);
25+
const req = client.request();
26+
27+
req.resume();
28+
req.on('response', common.mustCall(() => {
29+
assert.strictEqual(req.endAfterHeaders, false);
30+
}));
31+
req.on('end', common.mustCall(() => {
32+
client.close();
33+
countdown.dec();
34+
}));
35+
}
36+
{
37+
const client = http2.connect(`http://localhost:${server.address().port}`);
38+
const req = client.request({ ':method': 'POST' });
39+
40+
req.resume();
41+
req.end();
42+
req.on('response', common.mustCall(() => {
43+
assert.strictEqual(req.endAfterHeaders, false);
44+
}));
45+
req.on('end', common.mustCall(() => {
46+
client.close();
47+
countdown.dec();
48+
}));
49+
}
50+
}));

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.