mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-11-29 14:50:59 +01:00
MINOR: pattern: Each pattern sets the expected input type
This is used later for increasing the compability with incoming sample types. When multiple compatible types are supported, one is arbitrarily used (eg: UINT).
This commit is contained in:
parent
2d4771ba17
commit
cc0e0b3dbb
@ -86,6 +86,9 @@ enum pat_match_res pat_match_int(struct sample *smp, struct pattern *pattern);
|
|||||||
/* Parse an integer. It is put both in min and max. */
|
/* Parse an integer. It is put both in min and max. */
|
||||||
int pat_parse_int(const char **text, struct pattern *pattern, struct sample_storage *smp, int *opaque, char **err);
|
int pat_parse_int(const char **text, struct pattern *pattern, struct sample_storage *smp, int *opaque, char **err);
|
||||||
|
|
||||||
|
/* Parse len like an integer, but specify expected string type */
|
||||||
|
int pat_parse_len(const char **text, struct pattern *pattern, struct sample_storage *smp, int *opaque, char **err);
|
||||||
|
|
||||||
/* Parse an version. It is put both in min and max. */
|
/* Parse an version. It is put both in min and max. */
|
||||||
int pat_parse_dotted_ver(const char **text, struct pattern *pattern, struct sample_storage *smp, int *opaque, char **err);
|
int pat_parse_dotted_ver(const char **text, struct pattern *pattern, struct sample_storage *smp, int *opaque, char **err);
|
||||||
|
|
||||||
|
|||||||
@ -113,6 +113,7 @@ struct pat_idx_elt {
|
|||||||
struct pattern {
|
struct pattern {
|
||||||
struct list list; /* chaining */
|
struct list list; /* chaining */
|
||||||
int type; /* type of the ACL pattern (SMP_T_*) */
|
int type; /* type of the ACL pattern (SMP_T_*) */
|
||||||
|
int expect_type; /* type of the expected sample (SMP_T_*) */
|
||||||
union {
|
union {
|
||||||
int i; /* integer value */
|
int i; /* integer value */
|
||||||
struct {
|
struct {
|
||||||
|
|||||||
@ -45,7 +45,7 @@ int (*pat_parse_fcts[PAT_MATCH_NUM])(const char **, struct pattern *, struct sam
|
|||||||
[PAT_MATCH_INT] = pat_parse_int,
|
[PAT_MATCH_INT] = pat_parse_int,
|
||||||
[PAT_MATCH_IP] = pat_parse_ip,
|
[PAT_MATCH_IP] = pat_parse_ip,
|
||||||
[PAT_MATCH_BIN] = pat_parse_bin,
|
[PAT_MATCH_BIN] = pat_parse_bin,
|
||||||
[PAT_MATCH_LEN] = pat_parse_int,
|
[PAT_MATCH_LEN] = pat_parse_len,
|
||||||
[PAT_MATCH_STR] = pat_parse_str,
|
[PAT_MATCH_STR] = pat_parse_str,
|
||||||
[PAT_MATCH_BEG] = pat_parse_str,
|
[PAT_MATCH_BEG] = pat_parse_str,
|
||||||
[PAT_MATCH_SUB] = pat_parse_str,
|
[PAT_MATCH_SUB] = pat_parse_str,
|
||||||
@ -407,6 +407,7 @@ int pat_parse_str(const char **text, struct pattern *pattern, struct sample_stor
|
|||||||
|
|
||||||
len = strlen(*text);
|
len = strlen(*text);
|
||||||
pattern->type = SMP_T_CSTR;
|
pattern->type = SMP_T_CSTR;
|
||||||
|
pattern->expect_type = SMP_T_CSTR;
|
||||||
|
|
||||||
if (pattern->flags & PAT_F_TREE_OK) {
|
if (pattern->flags & PAT_F_TREE_OK) {
|
||||||
/* we're allowed to put the data in a tree whose root is pointed
|
/* we're allowed to put the data in a tree whose root is pointed
|
||||||
@ -441,6 +442,7 @@ int pat_parse_str(const char **text, struct pattern *pattern, struct sample_stor
|
|||||||
int pat_parse_bin(const char **text, struct pattern *pattern, struct sample_storage *smp, int *opaque, char **err)
|
int pat_parse_bin(const char **text, struct pattern *pattern, struct sample_storage *smp, int *opaque, char **err)
|
||||||
{
|
{
|
||||||
pattern->type = SMP_T_CBIN;
|
pattern->type = SMP_T_CBIN;
|
||||||
|
pattern->expect_type = SMP_T_CBIN;
|
||||||
pattern->smp = smp;
|
pattern->smp = smp;
|
||||||
|
|
||||||
return parse_binary(*text, &pattern->ptr.str, &pattern->len, err);
|
return parse_binary(*text, &pattern->ptr.str, &pattern->len, err);
|
||||||
@ -499,6 +501,7 @@ int pat_parse_reg(const char **text, struct pattern *pattern, struct sample_stor
|
|||||||
pattern->ptr.reg = preg;
|
pattern->ptr.reg = preg;
|
||||||
pattern->freeptrbuf = &pat_free_reg;
|
pattern->freeptrbuf = &pat_free_reg;
|
||||||
pattern->smp = smp;
|
pattern->smp = smp;
|
||||||
|
pattern->expect_type = SMP_T_CSTR;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -523,6 +526,7 @@ int pat_parse_int(const char **text, struct pattern *pattern, struct sample_stor
|
|||||||
const char *ptr = *text;
|
const char *ptr = *text;
|
||||||
|
|
||||||
pattern->type = SMP_T_UINT;
|
pattern->type = SMP_T_UINT;
|
||||||
|
pattern->expect_type = SMP_T_UINT;
|
||||||
pattern->smp = smp;
|
pattern->smp = smp;
|
||||||
while (!isdigit((unsigned char)*ptr)) {
|
while (!isdigit((unsigned char)*ptr)) {
|
||||||
switch (get_std_op(ptr)) {
|
switch (get_std_op(ptr)) {
|
||||||
@ -588,6 +592,15 @@ int pat_parse_int(const char **text, struct pattern *pattern, struct sample_stor
|
|||||||
return skip + 1;
|
return skip + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int pat_parse_len(const char **text, struct pattern *pattern, struct sample_storage *smp, int *opaque, char **err)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = pat_parse_int(text, pattern, smp, opaque, err);
|
||||||
|
pattern->expect_type = SMP_T_CSTR;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/* Parse a range of positive 2-component versions delimited by either ':' or
|
/* Parse a range of positive 2-component versions delimited by either ':' or
|
||||||
* '-'. The version consists in a major and a minor, both of which must be
|
* '-'. The version consists in a major and a minor, both of which must be
|
||||||
* smaller than 65536, because internally they will be represented as a 32-bit
|
* smaller than 65536, because internally they will be represented as a 32-bit
|
||||||
@ -668,6 +681,7 @@ int pat_parse_dotted_ver(const char **text, struct pattern *pattern, struct samp
|
|||||||
}
|
}
|
||||||
|
|
||||||
pattern->smp = smp;
|
pattern->smp = smp;
|
||||||
|
pattern->expect_type = SMP_T_CSTR;
|
||||||
|
|
||||||
if (!last)
|
if (!last)
|
||||||
pattern->val.range.min = i;
|
pattern->val.range.min = i;
|
||||||
@ -705,6 +719,7 @@ int pat_parse_ip(const char **text, struct pattern *pattern, struct sample_stora
|
|||||||
if (pattern->flags & PAT_F_TREE_OK)
|
if (pattern->flags & PAT_F_TREE_OK)
|
||||||
tree = pattern->val.tree;
|
tree = pattern->val.tree;
|
||||||
|
|
||||||
|
pattern->expect_type = SMP_T_ADDR;
|
||||||
if (str2net(*text, &pattern->val.ipv4.addr, &pattern->val.ipv4.mask)) {
|
if (str2net(*text, &pattern->val.ipv4.addr, &pattern->val.ipv4.mask)) {
|
||||||
unsigned int mask = ntohl(pattern->val.ipv4.mask.s_addr);
|
unsigned int mask = ntohl(pattern->val.ipv4.mask.s_addr);
|
||||||
struct pat_idx_elt *node;
|
struct pat_idx_elt *node;
|
||||||
|
|||||||
@ -8746,12 +8746,15 @@ static int pat_parse_meth(const char **text, struct pattern *pattern, struct sam
|
|||||||
pattern->val.i = meth;
|
pattern->val.i = meth;
|
||||||
if (meth == HTTP_METH_OTHER) {
|
if (meth == HTTP_METH_OTHER) {
|
||||||
pattern->ptr.str = strdup(*text);
|
pattern->ptr.str = strdup(*text);
|
||||||
|
pattern->expect_type = SMP_T_CSTR;
|
||||||
if (!pattern->ptr.str) {
|
if (!pattern->ptr.str) {
|
||||||
memprintf(err, "out of memory while loading pattern");
|
memprintf(err, "out of memory while loading pattern");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
pattern->len = len;
|
pattern->len = len;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
pattern->expect_type = SMP_T_UINT;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user