From e7ad4bb2f0c667c5ffe3953d59b4203a0c12fb30 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Fri, 21 Dec 2012 00:02:32 +0100 Subject: [PATCH] MINOR: samples: add a function to fetch and convert any sample to a string Any sample type can now easily be converted to a string that can be used anywhere. This will be used for logging and passing information in headers. --- include/proto/sample.h | 2 ++ src/sample.c | 25 +++++++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/include/proto/sample.h b/include/proto/sample.h index e6808dd4b..5241a3a7e 100644 --- a/include/proto/sample.h +++ b/include/proto/sample.h @@ -34,6 +34,8 @@ struct sample_expr *sample_parse_expr(char **str, int *idx, char *err, int err_s struct sample *sample_process(struct proxy *px, struct session *l4, void *l7, unsigned int dir, struct sample_expr *expr, struct sample *p); +struct sample *sample_fetch_string(struct proxy *px, struct session *l4, void *l7, + unsigned int opt, struct sample_expr *expr); void sample_register_fetches(struct sample_fetch_kw_list *psl); void sample_register_convs(struct sample_conv_kw_list *psl); struct chunk *sample_get_trash_chunk(void); diff --git a/src/sample.c b/src/sample.c index f5828fa90..3c0d01ef4 100644 --- a/src/sample.c +++ b/src/sample.c @@ -539,6 +539,31 @@ struct sample *sample_process(struct proxy *px, struct session *l4, void *l7, return p; } +/* + * Process a fetch + format conversion as defined by the sample expression + * on request or response considering the parameter. The output is always of + * type string. Returns either NULL if no sample could be extracted, or a pointer + * to the converted result stored in static temp_smp in format string. + */ +struct sample *sample_fetch_string(struct proxy *px, struct session *l4, void *l7, + unsigned int opt, struct sample_expr *expr) +{ + struct sample *smp; + + smp = sample_process(px, l4, l7, opt, expr, NULL); + if (!smp) + return NULL; + + if (!sample_casts[smp->type][SMP_T_CSTR]) + return NULL; + + if (!sample_casts[smp->type][SMP_T_CSTR](smp)) + return NULL; + + smp->type = SMP_T_CSTR; + return smp; +} + /*****************************************************************/ /* Sample format convert functions */ /* These functions set the data type on return. */