Willy, Here are small patches with minor changes about samples.
-- Christopher Faulet
>From 364139ba3764294acbad413a4cdde94a6ea1289b Mon Sep 17 00:00:00 2001 From: Christopher Faulet <cfau...@haproxy.com> Date: Mon, 24 Jul 2017 16:24:39 +0200 Subject: [PATCH 3/3] MINOR: samples: Don't allocate memory for SMP_T_METH sample when method is known For known methods (GET,POST...), in samples, an enum is used instead of a chunk to reference the method. So there is no needs to allocate memory when a variable is stored with this kind of sample. --- src/vars.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/vars.c b/src/vars.c index e5448e52..8cc08399 100644 --- a/src/vars.c +++ b/src/vars.c @@ -95,7 +95,7 @@ unsigned int var_clear(struct var *var) free(var->data.u.str.str); size += var->data.u.str.len; } - else if (var->data.type == SMP_T_METH) { + else if (var->data.type == SMP_T_METH && var->data.u.meth.meth == HTTP_METH_OTHER) { free(var->data.u.meth.str.str); size += var->data.u.meth.str.len; } @@ -309,7 +309,7 @@ static int sample_store(struct vars *vars, const char *name, struct sample *smp) free(var->data.u.str.str); var_accounting_diff(vars, smp->sess, smp->strm, -var->data.u.str.len); } - else if (var->data.type == SMP_T_METH) { + else if (var->data.type == SMP_T_METH && var->data.u.meth.meth == HTTP_METH_OTHER) { free(var->data.u.meth.str.str); var_accounting_diff(vars, smp->sess, smp->strm, -var->data.u.meth.str.len); } @@ -358,6 +358,10 @@ static int sample_store(struct vars *vars, const char *name, struct sample *smp) memcpy(var->data.u.str.str, smp->data.u.str.str, var->data.u.str.len); break; case SMP_T_METH: + var->data.u.meth.meth = smp->data.u.meth.meth; + if (smp->data.u.meth.meth != HTTP_METH_OTHER) + break; + if (!var_accounting_add(vars, smp->sess, smp->strm, smp->data.u.meth.str.len)) { var->data.type = SMP_T_BOOL; /* This type doesn't use additional memory. */ return 0; @@ -368,7 +372,6 @@ static int sample_store(struct vars *vars, const char *name, struct sample *smp) var->data.type = SMP_T_BOOL; /* This type doesn't use additional memory. */ return 0; } - var->data.u.meth.meth = smp->data.u.meth.meth; var->data.u.meth.str.len = smp->data.u.meth.str.len; var->data.u.meth.str.size = smp->data.u.meth.str.len; memcpy(var->data.u.meth.str.str, smp->data.u.meth.str.str, var->data.u.meth.str.len); -- 2.13.3
>From 8d1d40f9d3a86fdc52f88b10320419f7e7decb45 Mon Sep 17 00:00:00 2001 From: Christopher Faulet <cfau...@haproxy.com> Date: Mon, 24 Jul 2017 16:07:12 +0200 Subject: [PATCH 2/3] MINOR: samples: Handle the type SMP_T_METH in smp_is_safe and smp_is_rw For all known methods, samples are considered as safe and rewritable. For unknowns, we handle them like strings (SMP_T_STR). --- include/proto/sample.h | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/include/proto/sample.h b/include/proto/sample.h index 4319278a..94226d2d 100644 --- a/include/proto/sample.h +++ b/include/proto/sample.h @@ -86,6 +86,11 @@ static inline int smp_is_safe(struct sample *smp) { switch (smp->data.type) { + case SMP_T_METH: + if (smp->data.u.meth.meth != HTTP_METH_OTHER) + return 1; + /* Fall through */ + case SMP_T_STR: if ((smp->data.u.str.len < 0) || (smp->data.u.str.size && smp->data.u.str.len >= smp->data.u.str.size)) @@ -133,6 +138,11 @@ int smp_is_rw(struct sample *smp) return 0; switch (smp->data.type) { + case SMP_T_METH: + if (smp->data.u.meth.meth != HTTP_METH_OTHER) + return 1; + /* Fall through */ + case SMP_T_STR: if (!smp->data.u.str.size || smp->data.u.str.len < 0 || -- 2.13.3
>From b3a215635168a6f97d461bb8365b8a2daed531c6 Mon Sep 17 00:00:00 2001 From: Christopher Faulet <cfau...@haproxy.com> Date: Mon, 24 Jul 2017 15:38:41 +0200 Subject: [PATCH 1/3] MINOR: samples: Handle the type SMP_T_METH when we duplicate a sample in smp_dup First, the type SMP_T_METH was not handled by smp_dup function. It was never called with this kind of samples, so it's not really a problem. But, this could be useful in future. For all known HTTP methods (GET, POST...), there is no extra space allocated for a sample of type SMP_T_METH. But for unkown methods, it uses a chunk. So, like for strings, we duplicate data, using a trash chunk. --- src/sample.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/sample.c b/src/sample.c index 20a59bea..28a5fcb2 100644 --- a/src/sample.c +++ b/src/sample.c @@ -658,6 +658,11 @@ int smp_dup(struct sample *smp) /* These type are not const. */ break; + case SMP_T_METH: + if (smp->data.u.meth.meth != HTTP_METH_OTHER) + break; + /* Fall through */ + case SMP_T_STR: trash = get_trash_chunk(); trash->len = smp->data.u.str.len; @@ -678,6 +683,7 @@ int smp_dup(struct sample *smp) memcpy(trash->str, smp->data.u.str.str, trash->len); smp->data.u.str = *trash; break; + default: /* Other cases are unexpected. */ return 0; -- 2.13.3