Why do HTTP/2 CONTINUATION frames not have an END_STREAM flag?

Hi folks,

I was looking again at HTTP/2 frames and realized that CONTINUATION frames don't have an END_STREAM flag. Knowing why this is the case is not critical to anything but it got me curious.

Its possible to send HEADERS with END_STREAM=1, to send a request or response with no DATA frames at all. However, it seems any stream that uses CONTINUATION but has no HTTP content to send would have to use a sequence like:

1. HEADERS (END_HEADERS=0, END_STREAM=0), 
2. CONTINUATION (END_HEADERS=1), 
3. DATA (LENGTH=0, END_STREAM=1).

Empty DATA frames to signal stream close are not themselves a problem. The deployments I'm familiar with regularly send them. 

However, this raises an issue for anyone that might try to use CONTINUATION in trailers. You can't can't clean close the stream:

1. HEADERS (END_HEADERS=1, END_STREAM=0), 
2. DATA (END_STREAM=0),
3. HEADERS (END_HEADERS=0, END_STREAM=0), CONTINUATION (END_HEADERS=1)
4. Not valid to send DATA again, oops

Cheers,
Lucas

Received on Monday, 2 March 2026 21:37:22 UTC