]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: htx: add function to set EOM reliably
authorAmaury Denoyelle <adenoyelle@haproxy.com>
Thu, 11 May 2023 14:50:04 +0000 (16:50 +0200)
committerAmaury Denoyelle <adenoyelle@haproxy.com>
Fri, 12 May 2023 13:29:28 +0000 (15:29 +0200)
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.

include/haproxy/htx.h
src/mux_h2.c

index e80ecad68f8754cd4cd6768843ec272029bd6d9b..59e885a670d75ad0c8355844696c175cfff2a000 100644 (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.
index 949ffb313b487bf793c89fec9f02e97ebb605861..b531c6171fc017d3478ff36df36ddfc1ded1a53c 100644 (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;
                }
        }