Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
115 changes: 39 additions & 76 deletions nginx/ngx_http_js_module.c
Original file line number Diff line number Diff line change
Expand Up @@ -358,10 +358,8 @@ static void ngx_http_qjs_periodic_finalizer(JSRuntime *rt, JSValue val);
static ngx_pool_t *ngx_http_js_pool(ngx_http_request_t *r);
static ngx_resolver_t *ngx_http_js_resolver(ngx_http_request_t *r);
static ngx_msec_t ngx_http_js_resolver_timeout(ngx_http_request_t *r);
static ngx_msec_t ngx_http_js_fetch_timeout(ngx_http_request_t *r);
static size_t ngx_http_js_buffer_size(ngx_http_request_t *r);
static size_t ngx_http_js_max_response_buffer_size(ngx_http_request_t *r);
static void ngx_http_js_event_finalize(ngx_http_request_t *r, ngx_int_t rc);
static ngx_js_loc_conf_t *ngx_http_js_loc_conf(ngx_http_request_t *r);
static ngx_js_ctx_t *ngx_http_js_ctx(ngx_http_request_t *r);

static void ngx_http_js_periodic_handler(ngx_event_t *ev);
Expand Down Expand Up @@ -391,9 +389,6 @@ static void *ngx_http_js_create_loc_conf(ngx_conf_t *cf);
static char *ngx_http_js_merge_loc_conf(ngx_conf_t *cf, void *parent,
void *child);

static ngx_ssl_t *ngx_http_js_ssl(ngx_http_request_t *r);
static ngx_flag_t ngx_http_js_ssl_verify(ngx_http_request_t *r);

static ngx_int_t ngx_http_js_parse_unsafe_uri(ngx_http_request_t *r,
njs_str_t *uri, njs_str_t *args);

Expand Down Expand Up @@ -570,6 +565,34 @@ static ngx_command_t ngx_http_js_commands[] = {
0,
NULL },

{ ngx_string("js_fetch_keepalive"),
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
ngx_conf_set_num_slot,
NGX_HTTP_LOC_CONF_OFFSET,
offsetof(ngx_http_js_loc_conf_t, fetch_keepalive),
NULL },

{ ngx_string("js_fetch_keepalive_requests"),
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
ngx_conf_set_num_slot,
NGX_HTTP_LOC_CONF_OFFSET,
offsetof(ngx_http_js_loc_conf_t, fetch_keepalive_requests),
NULL },

{ ngx_string("js_fetch_keepalive_time"),
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
ngx_conf_set_msec_slot,
NGX_HTTP_LOC_CONF_OFFSET,
offsetof(ngx_http_js_loc_conf_t, fetch_keepalive_time),
NULL },

{ ngx_string("js_fetch_keepalive_timeout"),
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
ngx_conf_set_msec_slot,
NGX_HTTP_LOC_CONF_OFFSET,
offsetof(ngx_http_js_loc_conf_t, fetch_keepalive_timeout),
NULL },

ngx_null_command
};

Expand Down Expand Up @@ -972,13 +995,9 @@ static uintptr_t ngx_http_js_uptr[] = {
(uintptr_t) ngx_http_js_resolver,
(uintptr_t) ngx_http_js_resolver_timeout,
(uintptr_t) ngx_http_js_event_finalize,
(uintptr_t) ngx_http_js_ssl,
(uintptr_t) ngx_http_js_ssl_verify,
(uintptr_t) ngx_http_js_fetch_timeout,
(uintptr_t) ngx_http_js_buffer_size,
(uintptr_t) ngx_http_js_max_response_buffer_size,
(uintptr_t) 0 /* main_conf ptr */,
(uintptr_t) ngx_http_js_loc_conf,
(uintptr_t) ngx_http_js_ctx,
(uintptr_t) 0 /* main_conf ptr */,
};


Expand Down Expand Up @@ -4666,39 +4685,6 @@ ngx_http_js_resolver_timeout(ngx_http_request_t *r)
}


static ngx_msec_t
ngx_http_js_fetch_timeout(ngx_http_request_t *r)
{
ngx_http_js_loc_conf_t *jlcf;

jlcf = ngx_http_get_module_loc_conf(r, ngx_http_js_module);

return jlcf->timeout;
}


static size_t
ngx_http_js_buffer_size(ngx_http_request_t *r)
{
ngx_http_js_loc_conf_t *jlcf;

jlcf = ngx_http_get_module_loc_conf(r, ngx_http_js_module);

return jlcf->buffer_size;
}


static size_t
ngx_http_js_max_response_buffer_size(ngx_http_request_t *r)
{
ngx_http_js_loc_conf_t *jlcf;

jlcf = ngx_http_get_module_loc_conf(r, ngx_http_js_module);

return jlcf->max_response_body_size;
}


static void
ngx_http_js_event_finalize(ngx_http_request_t *r, ngx_int_t rc)
{
Expand All @@ -4721,6 +4707,13 @@ ngx_http_js_event_finalize(ngx_http_request_t *r, ngx_int_t rc)
}


static ngx_js_loc_conf_t *
ngx_http_js_loc_conf(ngx_http_request_t *r)
{
return ngx_http_get_module_loc_conf(r, ngx_http_js_module);
}


static ngx_js_ctx_t *
ngx_http_js_ctx(ngx_http_request_t *r)
{
Expand Down Expand Up @@ -7724,7 +7717,7 @@ ngx_http_js_init_conf_vm(ngx_conf_t *cf, ngx_js_loc_conf_t *conf)
options.engine = conf->type;

jmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_js_module);
ngx_http_js_uptr[NGX_JS_MAIN_CONF_INDEX] = (uintptr_t) jmcf;
ngx_http_js_uptr[NGX_JS_EXTERNAL_MAIN_CONF] = (uintptr_t) jmcf;

if (conf->type == NGX_ENGINE_NJS) {
options.u.njs.metas = &ngx_http_js_metas;
Expand Down Expand Up @@ -8236,36 +8229,6 @@ ngx_http_js_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)
}


static ngx_ssl_t *
ngx_http_js_ssl(ngx_http_request_t *r)
{
#if (NGX_HTTP_SSL)
ngx_http_js_loc_conf_t *jlcf;

jlcf = ngx_http_get_module_loc_conf(r, ngx_http_js_module);

return jlcf->ssl;
#else
return NULL;
#endif
}


static ngx_flag_t
ngx_http_js_ssl_verify(ngx_http_request_t *r)
{
#if (NGX_HTTP_SSL)
ngx_http_js_loc_conf_t *jlcf;

jlcf = ngx_http_get_module_loc_conf(r, ngx_http_js_module);

return jlcf->ssl_verify;
#else
return 0;
#endif
}


static ngx_int_t
ngx_http_js_parse_unsafe_uri(ngx_http_request_t *r, njs_str_t *uri,
njs_str_t *args)
Expand Down
17 changes: 17 additions & 0 deletions nginx/ngx_js.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
#include <ngx_core.h>
#include <math.h>
#include "ngx_js.h"
#include "ngx_js_http.h"


typedef struct {
Expand Down Expand Up @@ -3986,6 +3987,11 @@ ngx_js_create_conf(ngx_conf_t *cf, size_t size)
conf->max_response_body_size = NGX_CONF_UNSET_SIZE;
conf->timeout = NGX_CONF_UNSET_MSEC;

conf->fetch_keepalive = NGX_CONF_UNSET_UINT;
conf->fetch_keepalive_requests = NGX_CONF_UNSET_UINT;
conf->fetch_keepalive_time = NGX_CONF_UNSET_MSEC;
conf->fetch_keepalive_timeout = NGX_CONF_UNSET_MSEC;

return conf;
}

Expand Down Expand Up @@ -4097,6 +4103,17 @@ ngx_js_merge_conf(ngx_conf_t *cf, void *parent, void *child,
ngx_conf_merge_size_value(conf->max_response_body_size,
prev->max_response_body_size, 1048576);

ngx_conf_merge_uint_value(conf->fetch_keepalive, prev->fetch_keepalive, 0);
ngx_conf_merge_uint_value(conf->fetch_keepalive_requests,
prev->fetch_keepalive_requests, 1000);
ngx_conf_merge_msec_value(conf->fetch_keepalive_time,
prev->fetch_keepalive_time, 3600000);
ngx_conf_merge_msec_value(conf->fetch_keepalive_timeout,
prev->fetch_keepalive_timeout, 60000);

ngx_queue_init(&conf->fetch_keepalive_cache);
ngx_queue_init(&conf->fetch_keepalive_free);

if (ngx_js_merge_vm(cf, (ngx_js_loc_conf_t *) conf,
(ngx_js_loc_conf_t *) prev,
init_vm)
Expand Down
86 changes: 50 additions & 36 deletions nginx/ngx_js.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
#include <ngx_config.h>
#include <ngx_core.h>
#include <ngx_event.h>
#include <ngx_event_connect.h>
#include <njs.h>
#include <njs_rbtree.h>
#include <njs_arr.h>
Expand Down Expand Up @@ -80,9 +81,7 @@ typedef ngx_pool_t *(*ngx_external_pool_pt)(njs_external_ptr_t e);
typedef void (*ngx_js_event_finalize_pt)(njs_external_ptr_t e, ngx_int_t rc);
typedef ngx_resolver_t *(*ngx_external_resolver_pt)(njs_external_ptr_t e);
typedef ngx_msec_t (*ngx_external_timeout_pt)(njs_external_ptr_t e);
typedef ngx_flag_t (*ngx_external_flag_pt)(njs_external_ptr_t e);
typedef ngx_flag_t (*ngx_external_size_pt)(njs_external_ptr_t e);
typedef ngx_ssl_t *(*ngx_external_ssl_pt)(njs_external_ptr_t e);
typedef ngx_js_loc_conf_t *(*ngx_js_external_loc_conf_pt)(njs_external_ptr_t e);
typedef ngx_js_ctx_t *(*ngx_js_external_ctx_pt)(njs_external_ptr_t e);


Expand Down Expand Up @@ -135,7 +134,14 @@ typedef struct {
\
size_t buffer_size; \
size_t max_response_body_size; \
ngx_msec_t timeout
ngx_msec_t timeout; \
\
ngx_uint_t fetch_keepalive; \
ngx_uint_t fetch_keepalive_requests; \
ngx_msec_t fetch_keepalive_time; \
ngx_msec_t fetch_keepalive_timeout; \
ngx_queue_t fetch_keepalive_cache; \
ngx_queue_t fetch_keepalive_free


#if defined(NGX_HTTP_SSL) || defined(NGX_STREAM_SSL)
Expand Down Expand Up @@ -272,31 +278,35 @@ struct ngx_engine_s {
};


enum {
NGX_JS_EXTERNAL_CONNECTION = 0,
NGX_JS_EXTERNAL_POOL,
NGX_JS_EXTERNAL_RESOLVER,
NGX_JS_EXTERNAL_RESOLVER_TIMEOUT,
NGX_JS_EXTERNAL_EVENT_FINALIZE,
NGX_JS_EXTERNAL_LOC_CONF,
NGX_JS_EXTERNAL_CTX,
NGX_JS_EXTERNAL_MAIN_CONF,
};

#define ngx_external_connection(vm, e) \
(*((ngx_connection_t **) ((u_char *) (e) + njs_vm_meta(vm, 0))))
(*((ngx_connection_t **) \
((u_char *) (e) + njs_vm_meta(vm, NGX_JS_EXTERNAL_CONNECTION))))
#define ngx_external_pool(vm, e) \
((ngx_external_pool_pt) njs_vm_meta(vm, 1))(e)
((ngx_external_pool_pt) njs_vm_meta(vm, NGX_JS_EXTERNAL_POOL))(e)
#define ngx_external_resolver(vm, e) \
((ngx_external_resolver_pt) njs_vm_meta(vm, 2))(e)
((ngx_external_resolver_pt) njs_vm_meta(vm, NGX_JS_EXTERNAL_RESOLVER))(e)
#define ngx_external_resolver_timeout(vm, e) \
((ngx_external_timeout_pt) njs_vm_meta(vm, 3))(e)
((ngx_external_timeout_pt) \
njs_vm_meta(vm, NGX_JS_EXTERNAL_RESOLVER_TIMEOUT))(e)
#define ngx_external_event_finalize(vm) \
((ngx_js_event_finalize_pt) njs_vm_meta(vm, 4))
#define ngx_external_ssl(vm, e) \
((ngx_external_ssl_pt) njs_vm_meta(vm, 5))(e)
#define ngx_external_ssl_verify(vm, e) \
((ngx_external_flag_pt) njs_vm_meta(vm, 6))(e)
#define ngx_external_fetch_timeout(vm, e) \
((ngx_external_timeout_pt) njs_vm_meta(vm, 7))(e)
#define ngx_external_buffer_size(vm, e) \
((ngx_external_size_pt) njs_vm_meta(vm, 8))(e)
#define ngx_external_max_response_buffer_size(vm, e) \
((ngx_external_size_pt) njs_vm_meta(vm, 9))(e)
#define NGX_JS_MAIN_CONF_INDEX 10
#define ngx_main_conf(vm) \
((ngx_js_main_conf_t *) njs_vm_meta(vm, NGX_JS_MAIN_CONF_INDEX))
((ngx_js_event_finalize_pt) njs_vm_meta(vm, NGX_JS_EXTERNAL_EVENT_FINALIZE))
#define ngx_external_loc_conf(vm, e) \
((ngx_js_external_loc_conf_pt) njs_vm_meta(vm, NGX_JS_EXTERNAL_LOC_CONF))(e)
#define ngx_external_ctx(vm, e) \
((ngx_js_external_ctx_pt) njs_vm_meta(vm, 11))(e)
((ngx_js_external_ctx_pt) njs_vm_meta(vm, NGX_JS_EXTERNAL_CTX))(e)
#define ngx_main_conf(vm) \
((ngx_js_main_conf_t *) njs_vm_meta(vm, NGX_JS_EXTERNAL_MAIN_CONF))


#define ngx_js_prop(vm, type, value, start, len) \
Expand Down Expand Up @@ -367,29 +377,33 @@ JSValue ngx_qjs_ext_fetch(JSContext *cx, JSValueConst this_val, int argc,
#define ngx_qjs_meta(cx, i) \
((uintptr_t *) JS_GetRuntimeOpaque(JS_GetRuntime(cx)))[i]
#define ngx_qjs_external_connection(cx, e) \
(*((ngx_connection_t **) ((u_char *) (e) + ngx_qjs_meta(cx, 0))))
(*((ngx_connection_t **) \
((u_char *) (e) + ngx_qjs_meta(cx, NGX_JS_EXTERNAL_CONNECTION))))
#define ngx_qjs_external_pool(cx, e) \
((ngx_external_pool_pt) ngx_qjs_meta(cx, 1))(e)
((ngx_external_pool_pt) ngx_qjs_meta(cx, NGX_JS_EXTERNAL_POOL))(e)
#define ngx_qjs_external_resolver(cx, e) \
((ngx_external_resolver_pt) ngx_qjs_meta(cx, 2))(e)
((ngx_external_resolver_pt) ngx_qjs_meta(cx, NGX_JS_EXTERNAL_RESOLVER))(e)
#define ngx_qjs_external_resolver_timeout(cx, e) \
((ngx_external_timeout_pt) ngx_qjs_meta(cx, 3))(e)
((ngx_external_timeout_pt) \
ngx_qjs_meta(cx, NGX_JS_EXTERNAL_RESOLVER_TIMEOUT))(e)
#define ngx_qjs_external_event_finalize(cx) \
((ngx_js_event_finalize_pt) ngx_qjs_meta(cx, 4))
((ngx_js_event_finalize_pt) ngx_qjs_meta(cx, NGX_JS_EXTERNAL_EVENT_FINALIZE))
#define ngx_qjs_external_loc_conf(cx, e) \
((ngx_js_external_loc_conf_pt) ngx_qjs_meta(cx, NGX_JS_EXTERNAL_LOC_CONF))(e)
#define ngx_qjs_external_ssl(cx, e) \
((ngx_external_ssl_pt) ngx_qjs_meta(cx, 5))(e)
(ngx_qjs_external_loc_conf(cx, e)->ssl)
#define ngx_qjs_external_ssl_verify(cx, e) \
((ngx_external_flag_pt) ngx_qjs_meta(cx, 6))(e)
(ngx_qjs_external_loc_conf(cx, e)->ssl_verify)
#define ngx_qjs_external_fetch_timeout(cx, e) \
((ngx_external_timeout_pt) ngx_qjs_meta(cx, 7))(e)
(ngx_qjs_external_loc_conf(cx, e)->timeout)
#define ngx_qjs_external_buffer_size(cx, e) \
((ngx_external_size_pt) ngx_qjs_meta(cx, 8))(e)
(ngx_qjs_external_loc_conf(cx, e)->buffer_size)
#define ngx_qjs_external_max_response_buffer_size(cx, e) \
((ngx_external_size_pt) ngx_qjs_meta(cx, 9))(e)
#define ngx_qjs_main_conf(cx) \
((ngx_js_main_conf_t *) ngx_qjs_meta(cx, NGX_JS_MAIN_CONF_INDEX))
(ngx_qjs_external_loc_conf(cx, e)->max_response_body_size)
#define ngx_qjs_external_ctx(cx, e) \
((ngx_js_external_ctx_pt) ngx_qjs_meta(cx, 11))(e)
((ngx_js_external_ctx_pt) ngx_qjs_meta(cx, NGX_JS_EXTERNAL_CTX))(e)
#define ngx_qjs_main_conf(cx) \
((ngx_js_main_conf_t *) ngx_qjs_meta(cx, NGX_JS_EXTERNAL_MAIN_CONF))

extern qjs_module_t qjs_webcrypto_module;
extern qjs_module_t qjs_xml_module;
Expand Down
Loading