while (blk) {
type = htx_get_blk_type(blk);
ret += htx_get_blksz(blk);
+ if ((blk->flags & HTX_BLK_FL_EOM) && h2s->status >= 200) {
+ /* EOM: we may need to add END_STREAM except for 1xx
+ * responses and tunneled response.
+ */
+ h2s->flags &= ~H2_SF_MORE_HTX_DATA;
+ if (!(h2s->flags & H2_SF_BODY_TUNNEL) || h2s->status >= 300)
+ es_now = 1;
+ }
+
blk = htx_remove_blk(htx, blk);
/* The removed block is the EOH */
if (type == HTX_BLK_EOH)
/* Response already closed: add END_STREAM */
es_now = 1;
}
- else if ((htx->flags & HTX_FL_HAS_EOM) && htx_is_empty(htx) && h2s->status >= 200) {
- /* EOM+empty: we may need to add END_STREAM except for 1xx
- * responses and tunneled response.
- */
- h2s->flags &= ~H2_SF_MORE_HTX_DATA;
- if (!(h2s->flags & H2_SF_BODY_TUNNEL) || h2s->status >= 300)
- es_now = 1;
- }
if (es_now)
outbuf.area[4] |= H2_F_HEADERS_END_STREAM;
while (blk) {
type = htx_get_blk_type(blk);
ret += htx_get_blksz(blk);
+ if (blk->flags & HTX_BLK_FL_EOM) {
+ /* EOM+empty: we may need to add END_STREAM (except for CONNECT
+ * request)
+ */
+ h2s->flags &= ~H2_SF_MORE_HTX_DATA;
+ if (!(h2s->flags & H2_SF_BODY_TUNNEL))
+ es_now = 1;
+ }
+
blk = htx_remove_blk(htx, blk);
/* The removed block is the EOH */
if (type == HTX_BLK_EOH)
/* Request already closed: add END_STREAM */
es_now = 1;
}
- if ((htx->flags & HTX_FL_HAS_EOM) && htx_is_empty(htx)) {
- /* EOM+empty: we may need to add END_STREAM (except for CONNECT
- * request)
- */
- h2s->flags &= ~H2_SF_MORE_HTX_DATA;
- if (!(h2s->flags & H2_SF_BODY_TUNNEL))
- es_now = 1;
- }
if (es_now)
outbuf.area[4] |= H2_F_HEADERS_END_STREAM;
goto end;
}
- if (htx->flags & HTX_FL_HAS_EOM) {
- /* EOM+empty: we may need to add END_STREAM (except for tunneled
+ if (blk->flags & HTX_BLK_FL_EOM) {
+ /* EOM: we may need to add END_STREAM (except for tunneled
* message)
*/
h2s->flags &= ~H2_SF_MORE_HTX_DATA;
/* consume incoming HTX block */
total += fsize;
if (fsize == bsize) {
- htx_remove_blk(htx, blk);
- if ((htx->flags & HTX_FL_HAS_EOM) && htx_is_empty(htx)) {
+ if (blk->flags & HTX_BLK_FL_EOM) {
/* EOM+empty: we may need to add END_STREAM (except for tunneled
* message)
*/
if (!(h2s->flags & H2_SF_BODY_TUNNEL))
es_now = 1;
}
+ htx_remove_blk(htx, blk);
}
else {
/* we've truncated this block */
if (fsize != bsize)
goto skip_data;
- if (!(htx->flags & HTX_FL_HAS_EOM) || !htx_is_unique_blk(htx, blk))
+ if (!(blk->flags & HTX_BLK_FL_EOM))
goto skip_data;
h2s->flags &= ~H2_SF_MORE_HTX_DATA;