BUG/MINOR: stats: Parse post data for HTX streams
This part was just left out for no reason when the stats applet was adapted to
support the HTX messages.
diff --git a/src/stats.c b/src/stats.c
index 3ee1689..f69aa90 100644
--- a/src/stats.c
+++ b/src/stats.c
@@ -2712,26 +2712,85 @@
char *st_cur_param = NULL;
char *st_next_param = NULL;
- struct buffer *temp;
- int reql;
+ struct buffer *temp = get_trash_chunk();
- temp = get_trash_chunk();
- if (temp->size < s->txn->req.body_len) {
+ if (IS_HTX_STRM(s)) {
+ struct htx *htx = htxbuf(&s->req.buf);
+ struct htx_blk *blk;
+ size_t count = co_data(&s->req);
+
+ /* Remove the headers */
+ blk = htx_get_head_blk(htx);
+ while (count && blk) {
+ enum htx_blk_type type = htx_get_blk_type(blk);
+ uint32_t sz = htx_get_blksz(blk);
+
+ if (sz > count) {
+ appctx->ctx.stats.st_code = STAT_STATUS_NONE;
+ return 0;
+ }
+
+ count -= sz;
+ co_set_data(&s->req, co_data(&s->req) - sz);
+ blk = htx_remove_blk(htx, blk);
+
+ if (type == HTX_BLK_EOH)
+ break;
+ }
+
/* too large request */
- appctx->ctx.stats.st_code = STAT_STATUS_EXCD;
- goto out;
- }
+ if (htx->data + htx->extra > b_size(temp)) {
+ appctx->ctx.stats.st_code = STAT_STATUS_EXCD;
+ goto out;
+ }
- reql = co_getblk(si_oc(si), temp->area, s->txn->req.body_len,
- s->txn->req.eoh + 2);
- if (reql <= 0) {
/* we need more data */
- appctx->ctx.stats.st_code = STAT_STATUS_NONE;
- return 0;
+ if (htx->extra || htx->data > count) {
+ appctx->ctx.stats.st_code = STAT_STATUS_NONE;
+ return 0;
+ }
+
+ while (count && blk) {
+ enum htx_blk_type type = htx_get_blk_type(blk);
+ uint32_t sz = htx_get_blksz(blk);
+
+ if (type == HTX_BLK_EOM || type == HTX_BLK_EOD)
+ break;
+ if (type == HTX_BLK_DATA) {
+ struct ist v = htx_get_blk_value(htx, blk);
+
+ if (!chunk_memcat(temp, v.ptr, v.len)) {
+ appctx->ctx.stats.st_code = STAT_STATUS_EXCD;
+ goto out;
+ }
+ }
+
+ count -= sz;
+ co_set_data(&s->req, co_data(&s->req) - sz);
+ blk = htx_remove_blk(htx, blk);
+ }
+ }
+ else {
+ int reql;
+
+ if (temp->size < s->txn->req.body_len) {
+ /* too large request */
+ appctx->ctx.stats.st_code = STAT_STATUS_EXCD;
+ goto out;
+ }
+
+ reql = co_getblk(si_oc(si), temp->area, s->txn->req.body_len,
+ s->txn->req.eoh + 2);
+ if (reql <= 0) {
+ /* we need more data */
+ appctx->ctx.stats.st_code = STAT_STATUS_NONE;
+ return 0;
+ }
+ temp->data = reql;
}
first_param = temp->area;
- end_params = temp->area + reql;
+ end_params = temp->area + temp->data;
cur_param = next_param = end_params;
*end_params = '\0';