MINOR: checks: Add a sample fetch to extract a block from the input check buffer

It is now possible to extract information from the check input buffer using the
check.payload sample fetch. As req.payload or res.payload, an offset and a
length must be specified.

A new section has been added in the configuration manual. Now check sample
fetches will have to be documented under the section 7.3.7 (Fetching
health-check samples).
This commit is contained in:
Christopher Faulet 2020-04-01 16:27:05 +02:00
parent 6f2a5e4a19
commit ba3c68f91b
2 changed files with 60 additions and 2 deletions

View File

@ -87,7 +87,8 @@ Summary
7.3.4. Fetching samples at Layer 5
7.3.5. Fetching samples from buffer contents (Layer 6)
7.3.6. Fetching HTTP samples (Layer 7)
7.3.7. Fetching samples for developers
7.3.7. Fetching health-check samples
7.3.8. Fetching samples for developers
7.4. Pre-defined ACLs
8. Logging
@ -17164,7 +17165,25 @@ url32+src : binary
the source address family. This can be used to track per-IP, per-URL counters.
7.3.7. Fetching samples for developers
7.3.7. Fetching health-check samples
-------------------------------------
This set of sample fetch methods may be called from an health-check execution
context. It was introduced in the version 2.2. The following sample fetches are
placed in the dedicated scope "check". Other sample fetches may also be called
when an health-check is performed if it makes sense and if the sample fetch was
adapted to be called in this context.
check.payload(<offset>,<length>) : binary
This extracts a binary block of <length> bytes and starting at byte <offset>
in the check input buffer. As a special case, if the <length> argument is
zero, then the whole buffer from <offset> to the end is extracted. This can
be called from a tcp-check expect rule, or eventually from a set-var rule
after an expect rule and before a send rule (check input buffer is filled on
tcp-check expect rules and reset on tcp-check send rules).
7.3.8. Fetching samples for developers
---------------------------------------
This set of sample fetch methods is reserved to developers and must never be

View File

@ -44,6 +44,7 @@
#include <types/stats.h>
#include <proto/action.h>
#include <proto/arg.h>
#include <proto/backend.h>
#include <proto/checks.h>
#include <proto/stats.h>
@ -4122,6 +4123,44 @@ REGISTER_SERVER_DEINIT(deinit_srv_check);
REGISTER_SERVER_DEINIT(deinit_srv_agent_check);
REGISTER_POST_DEINIT(deinit_tcpchecks);
/* extracts check payload at a fixed position and length */
static int
smp_fetch_chk_payload(const struct arg *arg_p, struct sample *smp, const char *kw, void *private)
{
unsigned int buf_offset = ((arg_p[0].type == ARGT_SINT) ? arg_p[0].data.sint : 0);
unsigned int buf_size = ((arg_p[1].type == ARGT_SINT) ? arg_p[1].data.sint : 0);
struct server *srv = (smp->sess ? objt_server(smp->sess->origin) : NULL);
struct buffer *buf;
if (!srv || !srv->do_check)
return 0;
buf = &srv->check.bi;
if (buf_offset > b_data(buf))
goto no_match;
if (buf_offset + buf_size > b_data(buf))
buf_size = 0;
/* init chunk as read only */
smp->data.type = SMP_T_STR;
smp->flags = SMP_F_VOLATILE | SMP_F_CONST;
chunk_initlen(&smp->data.u.str, b_head(buf) + buf_offset, 0, (buf_size ? buf_size : (b_data(buf) - buf_offset)));
return 1;
no_match:
smp->flags = 0;
return 0;
}
static struct sample_fetch_kw_list smp_kws = {ILH, {
{ "check.payload", smp_fetch_chk_payload, ARG2(0,SINT,SINT), NULL, SMP_T_STR, SMP_USE_INTRN },
{ /* END */ },
}};
INITCALL1(STG_REGISTER, sample_register_fetches, &smp_kws);
struct action_kw_list tcp_check_keywords = {
.list = LIST_HEAD_INIT(tcp_check_keywords.list),
};