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. */