From: Willy Tarreau Date: Mon, 25 Mar 2013 13:52:41 +0000 (+0100) Subject: MINOR: sample: provide a function to report the name of a sample check point X-Git-Tag: v1.5-dev18~12 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=bf8e251077adda09d2d2fa1f8679e0dcccf0b5c0;p=thirdparty%2Fhaproxy.git MINOR: sample: provide a function to report the name of a sample check point We need to put names on places where samples are used in order to emit warnings and errors. Let's do that now. --- diff --git a/include/proto/sample.h b/include/proto/sample.h index 036ac7684d..9dc631abb0 100644 --- a/include/proto/sample.h +++ b/include/proto/sample.h @@ -35,6 +35,7 @@ struct sample *sample_fetch_string(struct proxy *px, struct session *l4, void *l void sample_register_fetches(struct sample_fetch_kw_list *psl); void sample_register_convs(struct sample_conv_kw_list *psl); const char *sample_src_names(unsigned int use); +const char *sample_src_names(unsigned int use); struct sample_fetch *find_sample_fetch(const char *kw, int len); #endif /* _PROTO_SAMPLE_H */ diff --git a/include/types/sample.h b/include/types/sample.h index 0e1cd780fe..9821dbcf98 100644 --- a/include/types/sample.h +++ b/include/types/sample.h @@ -74,6 +74,32 @@ enum { SMP_SRC_ENTRIES /* nothing after this */ }; +/* Sample checkpoints are a list of places where samples may be used. This is + * an internal enum used only to build SMP_VAL_*. + */ +enum { + SMP_CKP_FE_CON_ACC, /* FE connection accept rules ("tcp request connection") */ + SMP_CKP_FE_SES_ACC, /* FE session accept rules (to come soon) */ + SMP_CKP_FE_REQ_CNT, /* FE request content rules ("tcp request content") */ + SMP_CKP_FE_HRQ_HDR, /* FE HTTP request headers (rules, headers, monitor, stats, redirect) */ + SMP_CKP_FE_HRQ_BDY, /* FE HTTP request body */ + SMP_CKP_FE_SET_BCK, /* FE backend switching rules ("use_backend") */ + SMP_CKP_BE_REQ_CNT, /* BE request content rules ("tcp request content") */ + SMP_CKP_BE_HRQ_HDR, /* BE HTTP request headers (rules, headers, monitor, stats, redirect) */ + SMP_CKP_BE_HRQ_BDY, /* BE HTTP request body */ + SMP_CKP_BE_SET_SRV, /* BE server switching rules ("use_server", "balance", "force-persist", "stick", ...) */ + SMP_CKP_BE_SRV_CON, /* BE server connect (eg: "source") */ + SMP_CKP_BE_RES_CNT, /* BE response content rules ("tcp response content") */ + SMP_CKP_BE_HRS_HDR, /* BE HTTP response headers (rules, headers) */ + SMP_CKP_BE_HRS_BDY, /* BE HTTP response body (stick-store rules are there) */ + SMP_CKP_BE_STO_RUL, /* BE stick-store rules */ + SMP_CKP_FE_RES_CNT, /* FE response content rules ("tcp response content") */ + SMP_CKP_FE_HRS_HDR, /* FE HTTP response headers (rules, headers) */ + SMP_CKP_FE_HRS_BDY, /* FE HTTP response body */ + SMP_CKP_FE_LOG_END, /* FE log at the end of the txn/session */ + SMP_CKP_ENTRIES /* nothing after this */ +}; + /* SMP_USE_* are flags used to declare fetch keywords. Fetch methods are * associated with bitfields composed of these values, generally only one, to * indicate where the contents may be sampled. Some fetches are ambiguous as @@ -117,25 +143,25 @@ enum { */ enum { SMP_VAL___________ = 0, /* Just used as a visual marker */ - SMP_VAL_FE_CON_ACC = 1 << 0, /* FE connection accept rules ("tcp request connection") */ - SMP_VAL_FE_SES_ACC = 1 << 1, /* FE session accept rules (to come soon) */ - SMP_VAL_FE_REQ_CNT = 1 << 2, /* FE request content rules ("tcp request content") */ - SMP_VAL_FE_HRQ_HDR = 1 << 3, /* FE HTTP request headers (rules, headers, monitor, stats, redirect) */ - SMP_VAL_FE_HRQ_BDY = 1 << 4, /* FE HTTP request body */ - SMP_VAL_FE_SET_BCK = 1 << 5, /* FE backend switching rules ("use_backend") */ - SMP_VAL_BE_REQ_CNT = 1 << 6, /* BE request content rules ("tcp request content") */ - SMP_VAL_BE_HRQ_HDR = 1 << 7, /* BE HTTP request headers (rules, headers, monitor, stats, redirect) */ - SMP_VAL_BE_HRQ_BDY = 1 << 8, /* BE HTTP request body */ - SMP_VAL_BE_SET_SRV = 1 << 9, /* BE server switching rules ("use_server", "balance", "force-persist", "stick", ...) */ - SMP_VAL_BE_SRV_CON = 1 << 10, /* BE server connect (eg: "source") */ - SMP_VAL_BE_RES_CNT = 1 << 11, /* BE response content rules ("tcp response content") */ - SMP_VAL_BE_HRS_HDR = 1 << 12, /* BE HTTP response headers (rules, headers) */ - SMP_VAL_BE_HRS_BDY = 1 << 13, /* BE HTTP response body (stick-store rules are there) */ - SMP_VAL_BE_STO_RUL = 1 << 14, /* BE stick-store rules */ - SMP_VAL_FE_RES_CNT = 1 << 15, /* FE response content rules ("tcp response content") */ - SMP_VAL_FE_HRS_HDR = 1 << 16, /* FE HTTP response headers (rules, headers) */ - SMP_VAL_FE_HRS_BDY = 1 << 17, /* FE HTTP response body */ - SMP_VAL_FE_LOG_END = 1 << 18, /* FE log at the end of the txn/session */ + SMP_VAL_FE_CON_ACC = 1 << SMP_CKP_FE_CON_ACC, /* FE connection accept rules ("tcp request connection") */ + SMP_VAL_FE_SES_ACC = 1 << SMP_CKP_FE_SES_ACC, /* FE session accept rules (to come soon) */ + SMP_VAL_FE_REQ_CNT = 1 << SMP_CKP_FE_REQ_CNT, /* FE request content rules ("tcp request content") */ + SMP_VAL_FE_HRQ_HDR = 1 << SMP_CKP_FE_HRQ_HDR, /* FE HTTP request headers (rules, headers, monitor, stats, redirect) */ + SMP_VAL_FE_HRQ_BDY = 1 << SMP_CKP_FE_HRQ_BDY, /* FE HTTP request body */ + SMP_VAL_FE_SET_BCK = 1 << SMP_CKP_FE_SET_BCK, /* FE backend switching rules ("use_backend") */ + SMP_VAL_BE_REQ_CNT = 1 << SMP_CKP_BE_REQ_CNT, /* BE request content rules ("tcp request content") */ + SMP_VAL_BE_HRQ_HDR = 1 << SMP_CKP_BE_HRQ_HDR, /* BE HTTP request headers (rules, headers, monitor, stats, redirect) */ + SMP_VAL_BE_HRQ_BDY = 1 << SMP_CKP_BE_HRQ_BDY, /* BE HTTP request body */ + SMP_VAL_BE_SET_SRV = 1 << SMP_CKP_BE_SET_SRV, /* BE server switching rules ("use_server", "balance", "force-persist", "stick", ...) */ + SMP_VAL_BE_SRV_CON = 1 << SMP_CKP_BE_SRV_CON, /* BE server connect (eg: "source") */ + SMP_VAL_BE_RES_CNT = 1 << SMP_CKP_BE_RES_CNT, /* BE response content rules ("tcp response content") */ + SMP_VAL_BE_HRS_HDR = 1 << SMP_CKP_BE_HRS_HDR, /* BE HTTP response headers (rules, headers) */ + SMP_VAL_BE_HRS_BDY = 1 << SMP_CKP_BE_HRS_BDY, /* BE HTTP response body (stick-store rules are there) */ + SMP_VAL_BE_STO_RUL = 1 << SMP_CKP_BE_STO_RUL, /* BE stick-store rules */ + SMP_VAL_FE_RES_CNT = 1 << SMP_CKP_FE_RES_CNT, /* FE response content rules ("tcp response content") */ + SMP_VAL_FE_HRS_HDR = 1 << SMP_CKP_FE_HRS_HDR, /* FE HTTP response headers (rules, headers) */ + SMP_VAL_FE_HRS_BDY = 1 << SMP_CKP_FE_HRS_BDY, /* FE HTTP response body */ + SMP_VAL_FE_LOG_END = 1 << SMP_CKP_FE_LOG_END, /* FE log at the end of the txn/session */ /* a few combinations to decide what direction to try to fetch (useful for logs) */ SMP_VAL_REQUEST = SMP_VAL_FE_CON_ACC | SMP_VAL_FE_SES_ACC | SMP_VAL_FE_REQ_CNT | diff --git a/src/sample.c b/src/sample.c index c35e833d2a..3067cc7582 100644 --- a/src/sample.c +++ b/src/sample.c @@ -239,6 +239,28 @@ static const char *fetch_src_names[SMP_SRC_ENTRIES] = { [SMP_SRC_SSFIN] = "session statistics", }; +static const char *fetch_ckp_names[SMP_CKP_ENTRIES] = { + [SMP_CKP_FE_CON_ACC] = "frontend tcp-request connection rule", + [SMP_CKP_FE_SES_ACC] = "frontend tcp-request session rule", + [SMP_CKP_FE_REQ_CNT] = "frontend tcp-request content rule", + [SMP_CKP_FE_HRQ_HDR] = "frontend http-request header rule", + [SMP_CKP_FE_HRQ_BDY] = "frontend http-request body rule", + [SMP_CKP_FE_SET_BCK] = "frontend use-backend rule", + [SMP_CKP_BE_REQ_CNT] = "backend tcp-request content rule", + [SMP_CKP_BE_HRQ_HDR] = "backend http-request header rule", + [SMP_CKP_BE_HRQ_BDY] = "backend http-request body rule", + [SMP_CKP_BE_SET_SRV] = "backend use-server, balance or stick-match rule", + [SMP_CKP_BE_SRV_CON] = "server source selection", + [SMP_CKP_BE_RES_CNT] = "backend tcp-response content rule", + [SMP_CKP_BE_HRS_HDR] = "backend http-response header rule", + [SMP_CKP_BE_HRS_BDY] = "backend http-response body rule", + [SMP_CKP_BE_STO_RUL] = "backend stick-store rule", + [SMP_CKP_FE_RES_CNT] = "frontend tcp-response content rule", + [SMP_CKP_FE_HRS_HDR] = "frontend http-response header rule", + [SMP_CKP_FE_HRS_BDY] = "frontend http-response body rule", + [SMP_CKP_FE_LOG_END] = "logs", +}; + /* fill the trash with a comma-delimited list of source names for the bit * field which must be composed of a non-null set of SMP_USE_* flags. The return * value is the pointer to the string in the trash buffer. @@ -263,6 +285,20 @@ const char *sample_src_names(unsigned int use) return trash.str; } +/* return a pointer to the correct sample checkpoint name, or "unknown" when + * the flags are invalid. Only the lowest bit is used, higher bits are ignored + * if set. + */ +const char *sample_ckp_names(unsigned int use) +{ + int bit; + + for (bit = 0; bit < SMP_CKP_ENTRIES; bit++) + if (use & (1 << bit)) + return fetch_ckp_names[bit]; + return "unknown sample check place, please report this bug"; +} + /* * Registers the sample fetch keyword list as a list of valid keywords * for next parsing sessions. The fetch keywords capabilities are also computed