acl being_scanned be_sess_rate gt 100
redirect location /denied.html if being_scanned
+bin(<hexa>) : bin
+ Returns a binary chain. The input is the hexadecimal representation
+ of the string.
+
+bool(<bool>) : bool
+ Returns a boolean value. <bool> can be 'true', 'false', '1' or '0'.
+ 'false' and '0' are the same. 'true' and '1' are the same.
+
connslots([<backend>]) : integer
Returns an integer value corresponding to the number of connection slots
still available in the backend, by totaling the maximum amount of
tcp-request content accept if ! too_fast
tcp-request content accept if WAIT_END
+ipv4(<ipv4>) : ipv4
+ Returns an ipv4.
+
+ipv6(<ipv6>) : ipv6
+ Returns an ipv6.
+
+meth(<method>) : method
+ Returns a method.
+
nbproc : integer
Returns an integer value corresponding to the number of processes that were
started (it equals the global "nbproc" setting). This is useful for logging
needed to take some routing decisions for example, or just for debugging
purposes. This random must not be used for security purposes.
+sint(<sint>) : signed integer
+ Returns a signed integer.
+
srv_conn([<backend>/]<server>) : integer
Returns an integer value corresponding to the number of currently established
connections on the designated server, possibly including the connection being
can be useful for logging, or for relaxing certain checks or helping close
certain connections upon graceful shutdown.
+str(<string>) : string
+ Returns a string.
+
table_avl([<table>]) : integer
Returns the total number of available entries in the current proxy's
stick-table or in the designated stick-table. See also table_cnt.
stick-table or in the designated stick-table. See also src_conn_cnt and
table_avl for other entry counting methods.
+uint(<uint>) : unsigned integer
+ Returns an unsigned integer.
+
var(<var-name>) : undefined
Returns a variable with the stored type. If the variable is not set, the
sample fetch fails. The name of the variable starts by an indication about its
return 1;
}
+static int smp_fetch_const_str(const struct arg *args, struct sample *smp, const char *kw, void *private)
+{
+ smp->flags |= SMP_F_CONST;
+ smp->type = SMP_T_STR;
+ smp->data.str.str = args[0].data.str.str;
+ smp->data.str.len = args[0].data.str.len;
+ return 1;
+}
+
+static int smp_check_const_bool(struct arg *args, char **err)
+{
+ if (strcasecmp(args[0].data.str.str, "true") == 0 ||
+ strcasecmp(args[0].data.str.str, "1") == 0) {
+ args[0].type = ARGT_UINT;
+ args[0].data.uint = 1;
+ return 1;
+ }
+ if (strcasecmp(args[0].data.str.str, "false") == 0 ||
+ strcasecmp(args[0].data.str.str, "0") == 0) {
+ args[0].type = ARGT_UINT;
+ args[0].data.uint = 0;
+ return 1;
+ }
+ memprintf(err, "Expects 'true', 'false', '0' or '1'");
+ return 0;
+}
+
+static int smp_fetch_const_bool(const struct arg *args, struct sample *smp, const char *kw, void *private)
+{
+ smp->type = SMP_T_BOOL;
+ smp->data.uint = args[0].data.uint;
+ return 1;
+}
+
+static int smp_fetch_const_uint(const struct arg *args, struct sample *smp, const char *kw, void *private)
+{
+ smp->type = SMP_T_UINT;
+ smp->data.uint = args[0].data.uint;
+ return 1;
+}
+
+static int smp_fetch_const_sint(const struct arg *args, struct sample *smp, const char *kw, void *private)
+{
+ smp->type = SMP_T_SINT;
+ smp->data.sint = args[0].data.sint;
+ return 1;
+}
+
+static int smp_fetch_const_ipv4(const struct arg *args, struct sample *smp, const char *kw, void *private)
+{
+ smp->type = SMP_T_IPV4;
+ smp->data.ipv4 = args[0].data.ipv4;
+ return 1;
+}
+
+static int smp_fetch_const_ipv6(const struct arg *args, struct sample *smp, const char *kw, void *private)
+{
+ smp->type = SMP_T_IPV6;
+ smp->data.ipv6 = args[0].data.ipv6;
+ return 1;
+}
+
+static int smp_check_const_bin(struct arg *args, char **err)
+{
+ char *binstr;
+ int binstrlen;
+
+ if (!parse_binary(args[0].data.str.str, &binstr, &binstrlen, err))
+ return 0;
+ args[0].type = ARGT_STR;
+ args[0].data.str.str = binstr;
+ args[0].data.str.len = binstrlen;
+ return 1;
+}
+
+static int smp_fetch_const_bin(const struct arg *args, struct sample *smp, const char *kw, void *private)
+{
+ smp->flags |= SMP_F_CONST;
+ smp->type = SMP_T_BIN;
+ smp->data.str.str = args[0].data.str.str;
+ smp->data.str.len = args[0].data.str.len;
+ return 1;
+}
+
+static int smp_check_const_meth(struct arg *args, char **err)
+{
+ enum http_meth_t meth;
+ int i;
+
+ meth = find_http_meth(args[0].data.str.str, args[0].data.str.len);
+ if (meth != HTTP_METH_OTHER) {
+ args[0].type = ARGT_UINT;
+ args[0].data.uint = meth;
+ } else {
+ /* Check method avalaibility. A methos is a token defined as :
+ * tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*" / "+" / "-" / "." /
+ * "^" / "_" / "`" / "|" / "~" / DIGIT / ALPHA
+ * token = 1*tchar
+ */
+ for (i = 0; i < args[0].data.str.len; i++) {
+ if (!http_is_token[(unsigned char)args[0].data.str.str[i]]) {
+ memprintf(err, "expects valid method.");
+ return 0;
+ }
+ }
+ }
+ return 1;
+}
+
+static int smp_fetch_const_meth(const struct arg *args, struct sample *smp, const char *kw, void *private)
+{
+ smp->type = SMP_T_METH;
+ if (args[0].type == ARGT_UINT) {
+ smp->flags &= ~SMP_F_CONST;
+ smp->data.meth.meth = args[0].data.uint;
+ smp->data.meth.str.str = "";
+ smp->data.meth.str.len = 0;
+ } else {
+ smp->flags |= SMP_F_CONST;
+ smp->data.meth.meth = HTTP_METH_OTHER;
+ smp->data.meth.str.str = args[0].data.str.str;
+ smp->data.meth.str.len = args[0].data.str.len;
+ }
+ return 1;
+}
+
/* Note: must not be declared <const> as its list will be overwritten.
* Note: fetches that may return multiple types must be declared as the lowest
* common denominator, the type that can be casted into all other ones. For
{ "proc", smp_fetch_proc, 0, NULL, SMP_T_UINT, SMP_USE_INTRN },
{ "rand", smp_fetch_rand, ARG1(0,UINT), NULL, SMP_T_UINT, SMP_USE_INTRN },
{ "stopping", smp_fetch_stopping, 0, NULL, SMP_T_BOOL, SMP_USE_INTRN },
+
+ { "str", smp_fetch_const_str, ARG1(1,STR), NULL , SMP_T_STR, SMP_USE_INTRN },
+ { "bool", smp_fetch_const_bool, ARG1(1,STR), smp_check_const_bool, SMP_T_BOOL, SMP_USE_INTRN },
+ { "uint", smp_fetch_const_uint, ARG1(1,UINT), NULL , SMP_T_UINT, SMP_USE_INTRN },
+ { "sint", smp_fetch_const_sint, ARG1(1,SINT), NULL , SMP_T_SINT, SMP_USE_INTRN },
+ { "ipv4", smp_fetch_const_ipv4, ARG1(1,IPV4), NULL , SMP_T_IPV4, SMP_USE_INTRN },
+ { "ipv6", smp_fetch_const_ipv6, ARG1(1,IPV6), NULL , SMP_T_IPV6, SMP_USE_INTRN },
+ { "bin", smp_fetch_const_bin, ARG1(1,STR), smp_check_const_bin , SMP_T_BIN, SMP_USE_INTRN },
+ { "meth", smp_fetch_const_meth, ARG1(1,STR), smp_check_const_meth, SMP_T_METH, SMP_USE_INTRN },
+
{ /* END */ },
}};