MINOR: htx: add function to set EOM reliably

Implement a new HTX utility function htx_set_eom(). If the HTX message
is empty, it will first add a dummy EOT block. This is a small trick
needed to ensure readers will detect the HTX buffer as not empty and
retrieve the EOM flag.

Replace the H2 code related by a htx_set_eom() invocation. QUIC also has
the same code which will be replaced in the next commit.

This should be backported up to 2.7 before the related QUIC patch.
This commit is contained in:
Amaury Denoyelle 2023-05-11 16:50:04 +02:00
parent 76d502588d
commit 25cf19d5c8
2 changed files with 21 additions and 12 deletions

View File

@ -758,6 +758,24 @@ static inline int htx_expect_more(const struct htx *htx)
return !(htx->flags & HTX_FL_EOM);
}
/* Set EOM flag in <htx>. This function is useful if the HTX message is empty.
* In this case, an EOT block is appended first to ensure the EOM will be
* forwarded as expected. This is a workaround as it is not possibly currently
* to push an empty HTX DATA block.
*
* Returns 1 on success else 0.
*/
static inline int htx_set_eom(struct htx *htx)
{
if (htx_is_empty(htx)) {
if (!htx_add_endof(htx, HTX_BLK_EOT))
return 0;
}
htx->flags |= HTX_FL_EOM;
return 1;
}
/* Copy an HTX message stored in the buffer <msg> to <htx>. We take care to
* not overwrite existing data. All the message is copied or nothing. It returns
* 1 on success and 0 on error.

View File

@ -5095,18 +5095,9 @@ try_again:
* EOM was already reported.
*/
if ((h2c->flags & H2_CF_IS_BACK) || !(h2s->flags & H2_SF_TUNNEL_ABRT)) {
/* If we receive an empty DATA frame with ES flag while the HTX
* message is empty, we must be sure to push a block to be sure
* the HTX EOM flag will be handled on the other side. It is a
* workaround because for now it is not possible to push empty
* HTX DATA block. And without this block, there is no way to
* "commit" the end of the message.
*/
if (htx_is_empty(htx)) {
if (!htx_add_endof(htx, HTX_BLK_EOT))
goto fail;
}
htx->flags |= HTX_FL_EOM;
/* htx may be empty if receiving an empty DATA frame. */
if (!htx_set_eom(htx))
goto fail;
}
}