]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: sample: add hex converter
authorThierry FOURNIER <tfournier@exceliance.fr>
Wed, 12 Mar 2014 14:01:52 +0000 (15:01 +0100)
committerWilly Tarreau <w@1wt.eu>
Mon, 17 Mar 2014 15:39:18 +0000 (16:39 +0100)
This new filter converts BIN type to its hexadecimal
representation in STR type. It is used to keep the
compatibility with the original bin2str cast.

It will be useful when bin2str changes to copy the
string as-is without encoding anymore.

doc/configuration.txt
src/sample.c

index a8ff839b6c118bf130ee363d286d1e88aafb9d23..81a50994e88032fd2b3e4fef6c5227436b3452d5 100644 (file)
@@ -9343,6 +9343,11 @@ The currently available list of transformation keywords include :
                  after a string sample fetch function or after a transformation
                  keyword returning a string type. The result is of type string.
 
+  hex            Converts a binary input sample to an hex string containing two
+                 hex digits per input byte. It is used to log or transfer hex
+                 dumps of some binary input data in a way that can be reliably
+                 transferred (eg: an SSL ID can be copied in a header).
+
   ipmask(<mask>) Apply a mask to an IPv4 address, and use the result for
                  lookups and storage. This can be used to make all hosts within
                  a certain mask to share the same table entries and as such use
index 7f121b37cafab7f82dafcd8db12e4aee2ccde67b..3812913c902b35c82a89f3e7135d54043e45b591 100644 (file)
@@ -1089,6 +1089,23 @@ struct sample *sample_fetch_string(struct proxy *px, struct session *l4, void *l
 /*    These functions set the data type on return.               */
 /*****************************************************************/
 
+static int sample_conv_bin2hex(const struct arg *arg_p, struct sample *smp)
+{
+       struct chunk *trash = get_trash_chunk();
+       unsigned char c;
+       int ptr = 0;
+
+       trash->len = 0;
+       while (ptr < smp->data.str.len && trash->len <= trash->size - 2) {
+               c = smp->data.str.str[ptr++];
+               trash->str[trash->len++] = hextab[(c >> 4) & 0xF];
+               trash->str[trash->len++] = hextab[c & 0xF];
+       }
+       smp->data.str = *trash;
+       smp->type = SMP_T_STR;
+       return 1;
+}
+
 static int sample_conv_str2lower(const struct arg *arg_p, struct sample *smp)
 {
        int i;
@@ -1225,6 +1242,7 @@ static struct sample_fetch_kw_list smp_kws = {ILH, {
 static struct sample_conv_kw_list sample_conv_kws = {ILH, {
        { "upper",  sample_conv_str2upper, 0,            NULL, SMP_T_STR,  SMP_T_STR  },
        { "lower",  sample_conv_str2lower, 0,            NULL, SMP_T_STR,  SMP_T_STR  },
+       { "hex",    sample_conv_bin2hex,   0,            NULL, SMP_T_BIN,  SMP_T_STR  },
        { "ipmask", sample_conv_ipmask,    ARG1(1,MSK4), NULL, SMP_T_IPV4, SMP_T_IPV4 },
        { NULL, NULL, 0, 0, 0 },
 }};