MINOR: spoe: Move message encoding in its own function
Instead of having a big function to encode a list of messages, now we have a
function to unroll the list and a function to encode the message itself.
diff --git a/src/flt_spoe.c b/src/flt_spoe.c
index 9c50bf2..b8bb6ce 100644
--- a/src/flt_spoe.c
+++ b/src/flt_spoe.c
@@ -2095,6 +2095,85 @@
/***************************************************************************
* Functions that encode SPOE messages
**************************************************************************/
+/* Encode a SPOE message. Info in <ctx->frag_ctx>, if any, are used to handle
+ * fragmented_content. If the next message can be processed, it returns 0. If
+ * the message is too big, it returns -1.*/
+static int
+spoe_encode_message(struct stream *s, struct spoe_context *ctx,
+ struct spoe_message *msg, int dir,
+ char **buf, char *end)
+{
+ struct sample *smp;
+ struct spoe_arg *arg;
+ int ret;
+
+ if (msg->cond) {
+ ret = acl_exec_cond(msg->cond, s->be, s->sess, s, dir|SMP_OPT_FINAL);
+ ret = acl_pass(ret);
+ if (msg->cond->pol == ACL_COND_UNLESS)
+ ret = !ret;
+
+ /* the rule does not match */
+ if (!ret)
+ goto next;
+ }
+
+ /* Resume encoding of a SPOE argument */
+ if (ctx->frag_ctx.curarg != NULL) {
+ arg = ctx->frag_ctx.curarg;
+ goto encode_argument;
+ }
+
+ if (ctx->frag_ctx.curoff != UINT_MAX)
+ goto encode_msg_payload;
+
+ /* Check if there is enough space for the message name and the
+ * number of arguments. It implies <msg->id_len> is encoded on 2
+ * bytes, at most (< 2288). */
+ if (*buf + 2 + msg->id_len + 1 > end)
+ goto too_big;
+
+ /* Encode the message name */
+ if (spoe_encode_buffer(msg->id, msg->id_len, buf, end) == -1)
+ goto too_big;
+
+ /* Set the number of arguments for this message */
+ **buf = msg->nargs;
+ (*buf)++;
+
+ ctx->frag_ctx.curoff = 0;
+ encode_msg_payload:
+
+ /* Loop on arguments */
+ list_for_each_entry(arg, &msg->args, list) {
+ ctx->frag_ctx.curarg = arg;
+ ctx->frag_ctx.curoff = UINT_MAX;
+
+ encode_argument:
+ if (ctx->frag_ctx.curoff != UINT_MAX)
+ goto encode_arg_value;
+
+ /* Encode the arguement name as a string. It can by NULL */
+ if (spoe_encode_buffer(arg->name, arg->name_len, buf, end) == -1)
+ goto too_big;
+
+ ctx->frag_ctx.curoff = 0;
+ encode_arg_value:
+
+ /* Fetch the arguement value */
+ smp = sample_process(s->be, s->sess, s, dir|SMP_OPT_FINAL, arg->expr, NULL);
+ ret = spoe_encode_data(smp, &ctx->frag_ctx.curoff, buf, end);
+ if (ret == -1 || ctx->frag_ctx.curoff)
+ goto too_big;
+ }
+
+ next:
+ return 0;
+
+ too_big:
+ return -1;
+}
+
/* Encode SPOE messages for a specific event. Info in <ctx->frag_ctx>, if any,
* are used to handle fragmented content. On success it returns 1. If an error
* occurred, -1 is returned. If nothing has been encoded, it returns 0 (this is
@@ -2106,10 +2185,7 @@
struct spoe_config *conf = FLT_CONF(ctx->filter);
struct spoe_agent *agent = conf->agent;
struct spoe_message *msg;
- struct sample *smp;
- struct spoe_arg *arg;
char *p, *end;
- int ret;
p = ctx->buffer->p;
end = p + agent->frame_size - FRAME_HDR_SIZE;
@@ -2127,67 +2203,8 @@
ctx->frag_ctx.curoff = UINT_MAX;
encode_message:
- if (msg->cond) {
- int ret = 1;
-
- ret = acl_exec_cond(msg->cond, s->be, s->sess, s, dir|SMP_OPT_FINAL);
- ret = acl_pass(ret);
- if (msg->cond->pol == ACL_COND_UNLESS)
- ret = !ret;
-
- /* the rule does not match */
- if (!ret)
- continue;
- }
-
- /* Resume encoding of a SPOE argument */
- if (ctx->frag_ctx.curarg != NULL) {
- arg = ctx->frag_ctx.curarg;
- goto encode_argument;
- }
-
- if (ctx->frag_ctx.curoff != UINT_MAX)
- goto encode_msg_payload;
-
- /* Check if there is enough space for the message name and the
- * number of arguments. It implies <msg->id_len> is encoded on 2
- * bytes, at most (< 2288). */
- if (p + 2 + msg->id_len + 1 > end)
- goto too_big;
-
- /* Encode the message name */
- if (spoe_encode_buffer(msg->id, msg->id_len, &p, end) == -1)
+ if (spoe_encode_message(s, ctx, msg, dir, &p, end) == -1)
goto too_big;
-
- /* Set the number of arguments for this message */
- *p++ = msg->nargs;
-
- ctx->frag_ctx.curoff = 0;
- encode_msg_payload:
-
- /* Loop on arguments */
- list_for_each_entry(arg, &msg->args, list) {
- ctx->frag_ctx.curarg = arg;
- ctx->frag_ctx.curoff = UINT_MAX;
-
- encode_argument:
- if (ctx->frag_ctx.curoff != UINT_MAX)
- goto encode_arg_value;
-
- /* Encode the arguement name as a string. It can by NULL */
- if (spoe_encode_buffer(arg->name, arg->name_len, &p, end) == -1)
- goto too_big;
-
- ctx->frag_ctx.curoff = 0;
- encode_arg_value:
-
- /* Fetch the arguement value */
- smp = sample_process(s->be, s->sess, s,
- dir|SMP_OPT_FINAL, arg->expr, NULL);
- ret = spoe_encode_data(smp, &ctx->frag_ctx.curoff, &p, end);
- if (ret == -1 || ctx->frag_ctx.curoff)
- goto too_big;
- }
}
/* nothing has been encoded for an unfragmented payload */