summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorZhidao HONG <z.hong@f5.com>2024-08-16 00:06:45 +0800
committerZhidao HONG <z.hong@f5.com>2024-08-20 09:17:23 +0800
commit82e168fe01306cf03f8eaba284f31f7285347424 (patch)
treef04ed5df9b62e967315fc87916ad48137135c674 /src
parent5f6ae1a189b1736eb7cc35f1ff8018fd8606db9b (diff)
downloadunit-82e168fe01306cf03f8eaba284f31f7285347424.tar.gz
unit-82e168fe01306cf03f8eaba284f31f7285347424.tar.bz2
http: Refactor out nxt_tstr_cond_t from the access log module
This nxt_tstr_cond_t will be reused for the feature of adding "if" option to the "match" object. The two "if" options have the same usage.
Diffstat (limited to 'src')
-rw-r--r--src/nxt_http.h3
-rw-r--r--src/nxt_http_request.c80
-rw-r--r--src/nxt_router.h3
-rw-r--r--src/nxt_router_access_log.c11
-rw-r--r--src/nxt_tstr.c20
-rw-r--r--src/nxt_tstr.h8
6 files changed, 80 insertions, 45 deletions
diff --git a/src/nxt_http.h b/src/nxt_http.h
index fe5e72a8..5369c8e1 100644
--- a/src/nxt_http.h
+++ b/src/nxt_http.h
@@ -441,6 +441,9 @@ void nxt_h1p_complete_buffers(nxt_task_t *task, nxt_h1proto_t *h1p,
nxt_bool_t all);
nxt_msec_t nxt_h1p_conn_request_timer_value(nxt_conn_t *c, uintptr_t data);
+int nxt_http_cond_value(nxt_task_t *task, nxt_http_request_t *r,
+ nxt_tstr_cond_t *cond);
+
extern const nxt_conn_state_t nxt_h1p_idle_close_state;
#endif /* _NXT_HTTP_H_INCLUDED_ */
diff --git a/src/nxt_http_request.c b/src/nxt_http_request.c
index ccd2b141..a65163d0 100644
--- a/src/nxt_http_request.c
+++ b/src/nxt_http_request.c
@@ -915,44 +915,11 @@ static nxt_int_t
nxt_http_request_access_log(nxt_task_t *task, nxt_http_request_t *r,
nxt_router_conf_t *rtcf)
{
- nxt_int_t ret;
- nxt_str_t str;
- nxt_bool_t expr;
nxt_router_access_log_t *access_log;
access_log = rtcf->access_log;
- expr = 1;
-
- if (rtcf->log_expr != NULL) {
-
- if (nxt_tstr_is_const(rtcf->log_expr)) {
- nxt_tstr_str(rtcf->log_expr, &str);
-
- } else {
- ret = nxt_tstr_query_init(&r->tstr_query, rtcf->tstr_state,
- &r->tstr_cache, r, r->mem_pool);
- if (nxt_slow_path(ret != NXT_OK)) {
- return NXT_DECLINED;
- }
-
- ret = nxt_tstr_query(task, r->tstr_query, rtcf->log_expr, &str);
- if (nxt_slow_path(ret != NXT_OK)) {
- return NXT_DECLINED;
- }
- }
-
- if (str.length == 0
- || nxt_str_eq(&str, "0", 1)
- || nxt_str_eq(&str, "false", 5)
- || nxt_str_eq(&str, "null", 4)
- || nxt_str_eq(&str, "undefined", 9))
- {
- expr = 0;
- }
- }
-
- if (rtcf->log_negate ^ expr) {
+ if (nxt_http_cond_value(task, r, &rtcf->log_cond)) {
access_log->handler(task, r, access_log, rtcf->log_format);
return NXT_OK;
}
@@ -1364,3 +1331,48 @@ nxt_http_cookie_hash(nxt_mp_t *mp, nxt_str_t *name)
{
return nxt_http_field_hash(mp, name, 1, NXT_HTTP_URI_ENCODING_NONE);
}
+
+
+int
+nxt_http_cond_value(nxt_task_t *task, nxt_http_request_t *r,
+ nxt_tstr_cond_t *cond)
+{
+ nxt_int_t ret;
+ nxt_str_t str;
+ nxt_bool_t expr;
+ nxt_router_conf_t *rtcf;
+
+ rtcf = r->conf->socket_conf->router_conf;
+
+ expr = 1;
+
+ if (cond->expr != NULL) {
+
+ if (nxt_tstr_is_const(cond->expr)) {
+ nxt_tstr_str(cond->expr, &str);
+
+ } else {
+ ret = nxt_tstr_query_init(&r->tstr_query, rtcf->tstr_state,
+ &r->tstr_cache, r, r->mem_pool);
+ if (nxt_slow_path(ret != NXT_OK)) {
+ return -1;
+ }
+
+ ret = nxt_tstr_query(task, r->tstr_query, cond->expr, &str);
+ if (nxt_slow_path(ret != NXT_OK)) {
+ return -1;
+ }
+ }
+
+ if (str.length == 0
+ || nxt_str_eq(&str, "0", 1)
+ || nxt_str_eq(&str, "false", 5)
+ || nxt_str_eq(&str, "null", 4)
+ || nxt_str_eq(&str, "undefined", 9))
+ {
+ expr = 0;
+ }
+ }
+
+ return cond->negate ^ expr;
+}
diff --git a/src/nxt_router.h b/src/nxt_router.h
index cfc7258c..06c6bb32 100644
--- a/src/nxt_router.h
+++ b/src/nxt_router.h
@@ -54,8 +54,7 @@ typedef struct {
nxt_router_access_log_t *access_log;
nxt_tstr_t *log_format;
- nxt_tstr_t *log_expr;
- uint8_t log_negate; /* 1 bit */
+ nxt_tstr_cond_t log_cond;
} nxt_router_conf_t;
diff --git a/src/nxt_router_access_log.c b/src/nxt_router_access_log.c
index cc8d5e4f..afecd0b1 100644
--- a/src/nxt_router_access_log.c
+++ b/src/nxt_router_access_log.c
@@ -143,15 +143,8 @@ nxt_router_access_log_create(nxt_task_t *task, nxt_router_conf_t *rtcf,
if (alcf.expr != NULL) {
nxt_conf_get_string(alcf.expr, &str);
- if (str.length > 0 && str.start[0] == '!') {
- rtcf->log_negate = 1;
-
- str.start++;
- str.length--;
- }
-
- rtcf->log_expr = nxt_tstr_compile(rtcf->tstr_state, &str, 0);
- if (nxt_slow_path(rtcf->log_expr == NULL)) {
+ ret = nxt_tstr_cond_compile(rtcf->tstr_state, &str, &rtcf->log_cond);
+ if (nxt_slow_path(ret != NXT_OK)) {
return NXT_ERROR;
}
}
diff --git a/src/nxt_tstr.c b/src/nxt_tstr.c
index a6d2e7ad..50df4c47 100644
--- a/src/nxt_tstr.c
+++ b/src/nxt_tstr.c
@@ -196,6 +196,26 @@ nxt_tstr_state_release(nxt_tstr_state_t *state)
}
+nxt_int_t
+nxt_tstr_cond_compile(nxt_tstr_state_t *state, nxt_str_t *str,
+ nxt_tstr_cond_t *cond)
+{
+ if (str->length > 0 && str->start[0] == '!') {
+ cond->negate = 1;
+
+ str->start++;
+ str->length--;
+ }
+
+ cond->expr = nxt_tstr_compile(state, str, 0);
+ if (nxt_slow_path(cond->expr == NULL)) {
+ return NXT_ERROR;
+ }
+
+ return NXT_OK;
+}
+
+
nxt_bool_t
nxt_tstr_is_const(nxt_tstr_t *tstr)
{
diff --git a/src/nxt_tstr.h b/src/nxt_tstr.h
index 2aa905df..aca74e20 100644
--- a/src/nxt_tstr.h
+++ b/src/nxt_tstr.h
@@ -37,12 +37,20 @@ typedef enum {
} nxt_tstr_flags_t;
+typedef struct {
+ nxt_tstr_t *expr;
+ uint8_t negate; /* 1 bit */
+} nxt_tstr_cond_t;
+
+
nxt_tstr_state_t *nxt_tstr_state_new(nxt_mp_t *mp, nxt_bool_t test);
nxt_tstr_t *nxt_tstr_compile(nxt_tstr_state_t *state, const nxt_str_t *str,
nxt_tstr_flags_t flags);
nxt_int_t nxt_tstr_test(nxt_tstr_state_t *state, nxt_str_t *str, u_char *error);
nxt_int_t nxt_tstr_state_done(nxt_tstr_state_t *state, u_char *error);
void nxt_tstr_state_release(nxt_tstr_state_t *state);
+nxt_int_t nxt_tstr_cond_compile(nxt_tstr_state_t *state, nxt_str_t *str,
+ nxt_tstr_cond_t *cond);
nxt_bool_t nxt_tstr_is_const(nxt_tstr_t *tstr);
void nxt_tstr_str(nxt_tstr_t *tstr, nxt_str_t *str);