diff --git a/doc/configuration.txt b/doc/configuration.txt index a8ff839b6..81a50994e 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 7f121b37c..3812913c9 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 }, }};