summaryrefslogtreecommitdiffhomepage
path: root/src/nxt_router.c
diff options
context:
space:
mode:
authorZhidao HONG <z.hong@f5.com>2023-05-08 16:00:25 +0800
committerZhidao HONG <z.hong@f5.com>2023-05-08 16:00:25 +0800
commita3c3a29493798873ad04922bb2a7180b2ce267d5 (patch)
tree4332cbb50520c389d859db27e7266ffa53954b92 /src/nxt_router.c
parent56af7bb825c286e1a397f780bff9da275e5602ad (diff)
downloadunit-a3c3a29493798873ad04922bb2a7180b2ce267d5.tar.gz
unit-a3c3a29493798873ad04922bb2a7180b2ce267d5.tar.bz2
NJS: supported loadable modules.
Diffstat (limited to 'src/nxt_router.c')
-rw-r--r--src/nxt_router.c158
1 files changed, 153 insertions, 5 deletions
diff --git a/src/nxt_router.c b/src/nxt_router.c
index c4e29e3a..d089cfb8 100644
--- a/src/nxt_router.c
+++ b/src/nxt_router.c
@@ -11,6 +11,9 @@
#if (NXT_TLS)
#include <nxt_cert.h>
#endif
+#if (NXT_HAVE_NJS)
+#include <nxt_script.h>
+#endif
#include <nxt_http.h>
#include <nxt_port_memory_int.h>
#include <nxt_unit_request.h>
@@ -55,6 +58,17 @@ typedef struct {
#endif
+#if (NXT_HAVE_NJS)
+
+typedef struct {
+ nxt_str_t name;
+ nxt_router_temp_conf_t *temp_conf;
+ nxt_queue_link_t link;
+} nxt_router_js_module_t;
+
+#endif
+
+
typedef struct {
nxt_str_t *name;
nxt_socket_conf_t *socket_conf;
@@ -139,6 +153,12 @@ static nxt_int_t nxt_router_conf_tls_insert(nxt_router_temp_conf_t *tmcf,
nxt_conf_value_t *value, nxt_socket_conf_t *skcf, nxt_tls_init_t *tls_init,
nxt_bool_t last);
#endif
+#if (NXT_HAVE_NJS)
+static void nxt_router_js_module_rpc_handler(nxt_task_t *task,
+ nxt_port_recv_msg_t *msg, void *data);
+static nxt_int_t nxt_router_js_module_insert(nxt_router_temp_conf_t *tmcf,
+ nxt_conf_value_t *value);
+#endif
static void nxt_router_app_rpc_create(nxt_task_t *task,
nxt_router_temp_conf_t *tmcf, nxt_app_t *app);
static void nxt_router_app_prefork_ready(nxt_task_t *task,
@@ -1100,6 +1120,10 @@ nxt_router_temp_conf(nxt_task_t *task)
nxt_queue_init(&tmcf->tls);
#endif
+#if (NXT_HAVE_NJS)
+ nxt_queue_init(&tmcf->js_modules);
+#endif
+
nxt_queue_init(&tmcf->apps);
nxt_queue_init(&tmcf->previous);
@@ -1154,6 +1178,9 @@ nxt_router_conf_apply(nxt_task_t *task, void *obj, void *data)
#if (NXT_TLS)
nxt_router_tlssock_t *tls;
#endif
+#if (NXT_HAVE_NJS)
+ nxt_router_js_module_t *js_module;
+#endif
tmcf = obj;
@@ -1184,6 +1211,27 @@ nxt_router_conf_apply(nxt_task_t *task, void *obj, void *data)
}
#endif
+#if (NXT_HAVE_NJS)
+ qlk = nxt_queue_last(&tmcf->js_modules);
+
+ if (qlk != nxt_queue_head(&tmcf->js_modules)) {
+ nxt_queue_remove(qlk);
+
+ js_module = nxt_queue_link_data(qlk, nxt_router_js_module_t, link);
+
+ nxt_script_store_get(task, &js_module->name, tmcf->mem_pool,
+ nxt_router_js_module_rpc_handler, js_module);
+ return;
+ }
+#endif
+
+ rtcf = tmcf->router_conf;
+
+ ret = nxt_tstr_state_done(rtcf->tstr_state, NULL);
+ if (nxt_slow_path(ret != NXT_OK)) {
+ goto fail;
+ }
+
nxt_queue_each(app, &tmcf->apps, nxt_app_t, link) {
if (nxt_router_app_need_start(app)) {
@@ -1193,8 +1241,6 @@ nxt_router_conf_apply(nxt_task_t *task, void *obj, void *data)
} nxt_queue_loop;
- rtcf = tmcf->router_conf;
-
if (rtcf->access_log != NULL && rtcf->access_log->fd == -1) {
nxt_router_access_log_open(task, tmcf);
return;
@@ -1570,6 +1616,9 @@ nxt_router_conf_create(nxt_task_t *task, nxt_router_temp_conf_t *tmcf,
nxt_tls_init_t *tls_init;
nxt_conf_value_t *certificate;
#endif
+#if (NXT_HAVE_NJS)
+ nxt_conf_value_t *js_module;
+#endif
nxt_conf_value_t *root, *conf, *http, *value, *websocket;
nxt_conf_value_t *applications, *application;
nxt_conf_value_t *listeners, *listener;
@@ -1593,6 +1642,9 @@ nxt_router_conf_create(nxt_task_t *task, nxt_router_temp_conf_t *tmcf,
static nxt_str_t conf_timeout_path = nxt_string("/tls/session/timeout");
static nxt_str_t conf_tickets = nxt_string("/tls/session/tickets");
#endif
+#if (NXT_HAVE_NJS)
+ static nxt_str_t js_module_path = nxt_string("/settings/js_module");
+#endif
static nxt_str_t static_path = nxt_string("/settings/http/static");
static nxt_str_t websocket_path = nxt_string("/settings/http/websocket");
static nxt_str_t forwarded_path = nxt_string("/forwarded");
@@ -2064,11 +2116,34 @@ nxt_router_conf_create(nxt_task_t *task, nxt_router_temp_conf_t *tmcf,
}
}
- ret = nxt_tstr_state_done(rtcf->tstr_state, NULL);
- if (nxt_slow_path(ret != NXT_OK)) {
- goto fail;
+#if (NXT_HAVE_NJS)
+ js_module = nxt_conf_get_path(root, &js_module_path);
+
+ if (js_module != NULL) {
+ if (nxt_conf_type(js_module) == NXT_CONF_ARRAY) {
+ n = nxt_conf_array_elements_count(js_module);
+
+ for (i = 0; i < n; i++) {
+ value = nxt_conf_get_array_element(js_module, i);
+
+ ret = nxt_router_js_module_insert(tmcf, value);
+ if (nxt_slow_path(ret != NXT_OK)) {
+ goto fail;
+ }
+ }
+
+ } else {
+ /* NXT_CONF_STRING */
+
+ ret = nxt_router_js_module_insert(tmcf, js_module);
+ if (nxt_slow_path(ret != NXT_OK)) {
+ goto fail;
+ }
+ }
}
+#endif
+
nxt_queue_add(&deleting_sockets, &router->sockets);
nxt_queue_init(&router->sockets);
@@ -2120,6 +2195,79 @@ nxt_router_conf_tls_insert(nxt_router_temp_conf_t *tmcf,
#endif
+#if (NXT_HAVE_NJS)
+
+static void
+nxt_router_js_module_rpc_handler(nxt_task_t *task, nxt_port_recv_msg_t *msg,
+ void *data)
+{
+ nxt_int_t ret;
+ nxt_str_t text;
+ nxt_router_conf_t *rtcf;
+ nxt_router_temp_conf_t *tmcf;
+ nxt_router_js_module_t *js_module;
+
+ nxt_debug(task, "auto module rpc handler");
+
+ js_module = data;
+ tmcf = js_module->temp_conf;
+
+ if (msg == NULL || msg->port_msg.type == _NXT_PORT_MSG_RPC_ERROR) {
+ goto fail;
+ }
+
+ rtcf = tmcf->router_conf;
+
+ ret = nxt_script_file_read(msg->fd[0], &text);
+
+ nxt_fd_close(msg->fd[0]);
+
+ if (nxt_slow_path(ret == NXT_ERROR)) {
+ goto fail;
+ }
+
+ if (text.length > 0) {
+ ret = nxt_js_add_module(rtcf->tstr_state->jcf, &js_module->name, &text);
+
+ nxt_free(text.start);
+
+ if (nxt_slow_path(ret == NXT_ERROR)) {
+ goto fail;
+ }
+ }
+
+ nxt_work_queue_add(&task->thread->engine->fast_work_queue,
+ nxt_router_conf_apply, task, tmcf, NULL);
+ return;
+
+fail:
+
+ nxt_router_conf_error(task, tmcf);
+}
+
+
+static nxt_int_t
+nxt_router_js_module_insert(nxt_router_temp_conf_t *tmcf,
+ nxt_conf_value_t *value)
+{
+ nxt_router_js_module_t *js_module;
+
+ js_module = nxt_mp_get(tmcf->mem_pool, sizeof(nxt_router_js_module_t));
+ if (nxt_slow_path(js_module == NULL)) {
+ return NXT_ERROR;
+ }
+
+ js_module->temp_conf = tmcf;
+ nxt_conf_get_string(value, &js_module->name);
+
+ nxt_queue_insert_tail(&tmcf->js_modules, &js_module->link);
+
+ return NXT_OK;
+}
+
+#endif
+
+
static nxt_int_t
nxt_router_conf_process_static(nxt_task_t *task, nxt_router_conf_t *rtcf,
nxt_conf_value_t *conf)