From: Thierry FOURNIER Date: Wed, 12 Mar 2014 14:01:52 +0000 (+0100) Subject: MINOR: sample: add hex converter X-Git-Tag: v1.5-dev23~136 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=2f49d6d17be8825a2c64ed89434d85959b8000f8;p=thirdparty%2Fhaproxy.git MINOR: sample: add hex converter 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. --- diff --git a/doc/configuration.txt b/doc/configuration.txt index a8ff839b6c..81a50994e8 100644 --- a/doc/configuration.txt +++ b/doc/configuration.txt @@ -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() 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 diff --git a/src/sample.c b/src/sample.c index 7f121b37ca..3812913c90 100644 --- a/src/sample.c +++ b/src/sample.c @@ -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 }, }};