]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: htx: Add a function to find the HTX block corresponding to a data offset
authorChristopher Faulet <cfaulet@haproxy.com>
Thu, 22 Nov 2018 10:28:18 +0000 (11:28 +0100)
committerWilly Tarreau <w@1wt.eu>
Sat, 1 Dec 2018 16:37:27 +0000 (17:37 +0100)
The function htx_find_blk() returns the HTX block containing data with a given
offset, relatively to the beginning of the HTX message. It is a good way to skip
outgoing data and find the first HTX block not already processed.

include/proto/htx.h

index 77d077f75b14ec5c88743e855f1de74d2517843c..3c5c0fa01e477c8d36ec0e8c296ef7b43b092b86 100644 (file)
@@ -278,6 +278,26 @@ static inline int32_t htx_find_front(const struct htx *htx)
         return front;
 }
 
+/* Returns the HTX block containing data with the <offset>, relatively to the
+ * beginning of the HTX message <htx>. It returns an htx_ret. if the HTX block is
+ * not found, htx_ret.blk is set to NULL. Otherwise, it points to the right HTX
+ * block and htx_ret.ret is set to the remaining offset inside the block.
+ */
+static inline struct htx_ret htx_find_blk(const struct htx *htx, uint32_t offset)
+{
+       int32_t pos;
+
+       for (pos = htx_get_head(htx); pos != -1; pos = htx_get_next(htx, pos)) {
+               struct htx_blk *blk = htx_get_blk(htx, pos);
+               uint32_t sz = htx_get_blksz(blk);
+
+               if (offset < sz)
+                       return (struct htx_ret){ .blk = blk, .ret = offset };
+               offset -= sz;
+       }
+
+       return (struct htx_ret){ .blk = NULL };
+}
 /* Changes the size of the value. It is the caller responsibility to change the
  * value itself, make sure there is enough space and update allocated value.
  */