MINOR: http-fetch: Add a sample to get the transaction status code

It was possible get the status code in the HTTP response and the one
received from the server. Thanks to 'txn.status', it is now possible to get
the transaction status code. It is equivalent to '%ST' in log-format.

Most of time, it is the same than 'status', except if the status code of the
HTTP reply does not match the one used to interrupt the transaction. For
instance, an error file use mapped on 400 containing a 404.
This commit is contained in:
Christopher Faulet 2023-11-27 18:49:47 +01:00
parent 5d9c25bbea
commit 2de9e3ae24
2 changed files with 15 additions and 3 deletions

View File

@ -22844,6 +22844,10 @@ status : integer
It may be used in tcp-check based expect rules. It may be used in tcp-check based expect rules.
txn.status : integer
Return an integer containing the HTTP status code of the transaction, as
reported in the log.
txn.timer.total : integer txn.timer.total : integer
Total active time for the HTTP request, between the moment the proxy received Total active time for the HTTP request, between the moment the proxy received
the first byte of the request header and the emission of the last byte of the the first byte of the request header and the emission of the last byte of the
@ -23967,6 +23971,7 @@ Please refer to the table below for currently defined variables :
| | %ID | unique-id | string | | | %ID | unique-id | string |
+---+------+------------------------------------------------------+---------+ +---+------+------------------------------------------------------+---------+
| | %ST | status_code | numeric | | | %ST | status_code | numeric |
| | | %[txn.status] | |
+---+------+------------------------------------------------------+---------+ +---+------+------------------------------------------------------+---------+
| | %U | bytes_uploaded (from client to server) | numeric | | | %U | bytes_uploaded (from client to server) | numeric |
| | | %[bytes_in] | | | | | %[bytes_in] | |

View File

@ -445,25 +445,31 @@ static int smp_fetch_stcode(const struct arg *args, struct sample *smp, const ch
return 1; return 1;
} }
/* It returns the server status code */ /* It returns the server or the txn status code, depending on the keyword */
static int smp_fetch_srv_status(const struct arg *args, struct sample *smp, const char *kw, void *private) static int smp_fetch_srv_status(const struct arg *args, struct sample *smp, const char *kw, void *private)
{ {
struct http_txn *txn; struct http_txn *txn;
short status;
txn = (smp->strm ? smp->strm->txn : NULL); txn = (smp->strm ? smp->strm->txn : NULL);
if (!txn) if (!txn)
return 0; return 0;
if (txn->server_status == -1) { status = (kw[0] == 't' ? txn->status : txn->server_status);
if (status == -1) {
struct channel *chn = SMP_RES_CHN(smp); struct channel *chn = SMP_RES_CHN(smp);
struct htx *htx = smp_prefetch_htx(smp, chn, NULL, 1); struct htx *htx = smp_prefetch_htx(smp, chn, NULL, 1);
if (!htx) if (!htx)
return 0; return 0;
status = (kw[0] == 't' ? txn->status : txn->server_status);
} }
if (kw[0] != 't')
smp->flags = SMP_F_VOL_1ST;
smp->data.type = SMP_T_SINT; smp->data.type = SMP_T_SINT;
smp->data.u.sint = txn->server_status; smp->data.u.sint = status;
return 1; return 1;
} }
@ -2338,6 +2344,7 @@ static struct sample_fetch_kw_list sample_fetch_keywords = {ILH, {
{ "shdr_val", smp_fetch_hdr_val, ARG2(0,STR,SINT), val_hdr, SMP_T_SINT, SMP_USE_HRSHV }, { "shdr_val", smp_fetch_hdr_val, ARG2(0,STR,SINT), val_hdr, SMP_T_SINT, SMP_USE_HRSHV },
{ "status", smp_fetch_stcode, 0, NULL, SMP_T_SINT, SMP_USE_HRSHP }, { "status", smp_fetch_stcode, 0, NULL, SMP_T_SINT, SMP_USE_HRSHP },
{ "txn.status", smp_fetch_srv_status, 0, NULL, SMP_T_SINT, SMP_USE_HRSHP },
{ "unique-id", smp_fetch_uniqueid, 0, NULL, SMP_T_STR, SMP_SRC_L4SRV }, { "unique-id", smp_fetch_uniqueid, 0, NULL, SMP_T_STR, SMP_SRC_L4SRV },
{ "url", smp_fetch_url, 0, NULL, SMP_T_STR, SMP_USE_HRQHV }, { "url", smp_fetch_url, 0, NULL, SMP_T_STR, SMP_USE_HRQHV },
{ "url32", smp_fetch_url32, 0, NULL, SMP_T_SINT, SMP_USE_HRQHV }, { "url32", smp_fetch_url32, 0, NULL, SMP_T_SINT, SMP_USE_HRQHV },