]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: spoe: Use the sample context to pass frag_ctx info during encoding
authorChristopher Faulet <cfaulet@haproxy.com>
Fri, 26 Apr 2019 12:30:15 +0000 (14:30 +0200)
committerChristopher Faulet <cfaulet@haproxy.com>
Mon, 29 Apr 2019 14:02:05 +0000 (16:02 +0200)
This simplifies the API and hide the details in the sample. This way, only
string and binary are aware of these info, because other types cannot be
partially encoded.

This patch may be backported to 1.9 and 1.8.

include/proto/spoe.h
src/flt_spoe.c

index 86328adef1c4c134fc0493559bcef2004676542a..c840c887b7b89a09270c22b86bae70c2bf141cc8 100644 (file)
@@ -117,11 +117,9 @@ spoe_decode_buffer(char **buf, char *end, char **str, uint64_t *len)
  *
  * If the value is too big to be encoded, depending on its type, then encoding
  * failed or the value is partially encoded. Only strings and binaries can be
- * partially encoded. In this case, the offset <*off> is updated to known how
- * many bytes has been encoded. If <*off> is zero at the end, it means that all
- * data has been encoded. */
+ * partially encoded. */
 static inline int
-spoe_encode_data(unsigned int *len, struct sample *smp, unsigned int *off, char **buf, char *end)
+spoe_encode_data(struct sample *smp, char **buf, char *end)
 {
        char *p = *buf;
        int   ret;
@@ -164,12 +162,16 @@ spoe_encode_data(unsigned int *len, struct sample *smp, unsigned int *off, char
 
                case SMP_T_STR:
                case SMP_T_BIN: {
+                       /* If defined, get length and offset of the sample by reading the sample
+                        * context. ctx.a[0] is the pointer to the length and ctx.a[1] is the
+                        * pointer to the offset. If the offset is greater than 0, it means the
+                        * sample is partially encoded. In this case, we only need to encode the
+                        * reamining. When all the sample is encoded, the offset is reset to 0.
+                        * So the caller know it can try to encode the next sample. */
                        struct buffer *chk = &smp->data.u.str;
+                       unsigned int *len  = (smp->ctx.a[0] ? smp->ctx.a[0] : 0);
+                       unsigned int *off  = (smp->ctx.a[1] ? smp->ctx.a[1] : 0);
 
-                       /* Here, we need to know if the sample has already been
-                        * partially encoded. If yes, we only need to encode the
-                        * remaining, <*off> reprensenting the number of bytes
-                        * already encoded. */
                        if (!*off) {
                                /* First evaluation of the sample : encode the
                                 * type (string or binary), the buffer length
index 609fa306f14b534ad0ab2d387c501796f47aad6f..2d70aff5bee73cda0c66c3b29311eb20c530486b 100644 (file)
@@ -2197,7 +2197,9 @@ spoe_encode_message(struct stream *s, struct spoe_context *ctx,
 
                /* Fetch the argument value */
                smp = sample_process(s->be, s->sess, s, dir|SMP_OPT_FINAL, arg->expr, NULL);
-               ret = spoe_encode_data(&ctx->frag_ctx.curlen, smp, &ctx->frag_ctx.curoff, buf, end);
+               smp->ctx.a[0] = &ctx->frag_ctx.curlen;
+               smp->ctx.a[1] = &ctx->frag_ctx.curoff;
+               ret = spoe_encode_data(smp, buf, end);
                if (ret == -1 || ctx->frag_ctx.curoff)
                        goto too_big;
        }