]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: channel/htx: Add functions to forward a part or all HTX payload
authorChristopher Faulet <cfaulet@haproxy.com>
Thu, 23 May 2019 09:06:10 +0000 (11:06 +0200)
committerWilly Tarreau <w@1wt.eu>
Tue, 28 May 2019 05:42:33 +0000 (07:42 +0200)
The functions channel_htx_fwd_payload() and channel_htx_fwd_all() should now be
used to forward, respectively, a part of the HTX payload or all of it. These
functions forward data and update the first block position.

include/proto/channel.h

index 3ebaf7fce3926bb6441a58db08d4ae7a7c2f4978..d192c9b28e8072d26b6ebeeb939ff1dc28095c9d 100644 (file)
@@ -912,7 +912,7 @@ static inline void channel_slow_realign(struct channel *chn, char *swap)
 
 
 /* Forward all headers of an HTX message, starting from the SL to the EOH. This
- * function also updates the start-line position.
+ * function also updates the first block position.
  */
 static inline void channel_htx_fwd_headers(struct channel *chn, struct htx *htx)
 {
@@ -930,6 +930,33 @@ static inline void channel_htx_fwd_headers(struct channel *chn, struct htx *htx)
        c_adv(chn, data);
 }
 
+/* Forward <data> bytes of payload of an HTX message. This function also updates
+ * the first block position.
+ */
+static inline void channel_htx_fwd_payload(struct channel *chn, struct htx *htx, size_t data)
+{
+       int32_t pos;
+
+       c_adv(chn, data);
+       for (pos = htx_get_first(htx); pos != -1; pos = htx_get_next(htx, pos)) {
+               uint32_t sz = htx_get_blksz(htx_get_blk(htx, pos));
+
+               if (data < sz)
+                       break;
+               data -= sz;
+       }
+       htx->first = pos;
+}
+
+/* Forward all data of an HTX message. This function also updates the first
+ * block position.
+ */
+static inline void channel_htx_fwd_all(struct channel *chn, struct htx *htx)
+{
+       htx->first = -1;
+       c_adv(chn, htx->data - co_data(chn));
+}
+
 /*
  * Advance the channel buffer's read pointer by <len> bytes. This is useful
  * when data have been read directly from the buffer. It is illegal to call