mirror of
http://git.haproxy.org/git/haproxy.git
synced 2026-02-10 15:02:49 +02:00
MINOR: sample: Add iif(<true>,<false>) converter
iif() takes a boolean as input and returns one of the two argument strings depending on whether the boolean is true. This converter most likely is most useful to return the proper scheme depending on the value returned by the `ssl_fc` fetch, e.g. for use within the `x-forwarded-proto` request header. However it can also be useful for use within a template that is sent to the client using `http-request return` with a `lf-file`. It allows the administrator to implement a simple condition, without needing to prefill variables within the regular configuration using `http-request set-var(req.foo)`.
This commit is contained in:
committed by
Willy Tarreau
parent
00c363ba9d
commit
3943e4fc3e
22
src/sample.c
22
src/sample.c
@@ -3121,6 +3121,26 @@ static int sample_conv_secure_memcmp(const struct arg *arg_p, struct sample *smp
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Takes a boolean as input. Returns the first argument if that boolean is true and
|
||||
* the second argument otherwise.
|
||||
*/
|
||||
static int sample_conv_iif(const struct arg *arg_p, struct sample *smp, void *private)
|
||||
{
|
||||
smp->data.type = SMP_T_STR;
|
||||
smp->flags |= SMP_F_CONST;
|
||||
|
||||
if (smp->data.u.sint) {
|
||||
smp->data.u.str.data = arg_p[0].data.str.data;
|
||||
smp->data.u.str.area = arg_p[0].data.str.area;
|
||||
}
|
||||
else {
|
||||
smp->data.u.str.data = arg_p[1].data.str.data;
|
||||
smp->data.u.str.area = arg_p[1].data.str.area;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
#define GRPC_MSG_COMPRESS_FLAG_SZ 1 /* 1 byte */
|
||||
#define GRPC_MSG_LENGTH_SZ 4 /* 4 bytes */
|
||||
#define GRPC_MSG_HEADER_SZ (GRPC_MSG_COMPRESS_FLAG_SZ + GRPC_MSG_LENGTH_SZ)
|
||||
@@ -3782,6 +3802,8 @@ static struct sample_conv_kw_list sample_conv_kws = {ILH, {
|
||||
{ "ungrpc", sample_conv_ungrpc, ARG2(1,PBUF_FNUM,STR), sample_conv_protobuf_check, SMP_T_BIN, SMP_T_BIN },
|
||||
{ "protobuf", sample_conv_protobuf, ARG2(1,PBUF_FNUM,STR), sample_conv_protobuf_check, SMP_T_BIN, SMP_T_BIN },
|
||||
|
||||
{ "iif", sample_conv_iif, ARG2(2, STR, STR), NULL, SMP_T_BOOL, SMP_T_STR },
|
||||
|
||||
{ "and", sample_conv_binary_and, ARG1(1,STR), check_operator, SMP_T_SINT, SMP_T_SINT },
|
||||
{ "or", sample_conv_binary_or, ARG1(1,STR), check_operator, SMP_T_SINT, SMP_T_SINT },
|
||||
{ "xor", sample_conv_binary_xor, ARG1(1,STR), check_operator, SMP_T_SINT, SMP_T_SINT },
|
||||
|
||||
Reference in New Issue
Block a user