]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: samples: Don't allocate memory for SMP_T_METH sample when method is known
authorChristopher Faulet <cfaulet@haproxy.com>
Mon, 24 Jul 2017 14:24:39 +0000 (16:24 +0200)
committerWilly Tarreau <w@1wt.eu>
Mon, 24 Jul 2017 15:16:11 +0000 (17:16 +0200)
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

index e5448e526ba9ec54f49d4adb9c8c2b1f2a0ce3fc..8cc08399c315a6044c8c26fdf7bdcdbd0a5ba58e 100644 (file)
@@ -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);