Skip to content

Commit 73c75e4

Browse files
committed
Modules: added ngx.fetch().
This is an initial implementation of Fetch API. The following init options are supported: body, headers, buffer_size (nginx specific), max_response_body_size (nginx specific), method. The following properties and methods of Response object are implemented: arrayBuffer(), bodyUsed, json(), headers, ok, redirect, status, statusText, text(), type, url. The following properties and methods of Header object are implemented: get(), getAll(), has(). Notable limitations: only http:// scheme is supported, redirects are not handled. In collaboration with 洪志道 (Hong Zhi Dao).
1 parent 300c851 commit 73c75e4

7 files changed

+2377
-11
lines changed

nginx/config

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
ngx_addon_name="ngx_js_module"
22

33
NJS_DEPS="$ngx_addon_dir/ngx_js.h"
4-
NJS_SRCS="$ngx_addon_dir/ngx_js.c"
4+
NJS_SRCS="$ngx_addon_dir/ngx_js.c \
5+
$ngx_addon_dir/ngx_js_fetch.c"
56

67
if [ $HTTP != NO ]; then
78
ngx_module_type=HTTP

nginx/ngx_http_js_module.c

+56-7
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,13 @@ static njs_host_event_t ngx_http_js_set_timer(njs_external_ptr_t external,
179179
static void ngx_http_js_clear_timer(njs_external_ptr_t external,
180180
njs_host_event_t event);
181181
static void ngx_http_js_timer_handler(ngx_event_t *ev);
182+
static ngx_pool_t *ngx_http_js_pool(njs_vm_t *vm, ngx_http_request_t *r);
183+
static ngx_resolver_t *ngx_http_js_resolver(njs_vm_t *vm,
184+
ngx_http_request_t *r);
185+
static ngx_msec_t ngx_http_js_resolver_timeout(njs_vm_t *vm,
186+
ngx_http_request_t *r);
187+
static void ngx_http_js_handle_vm_event(ngx_http_request_t *r,
188+
njs_vm_event_t vm_event, njs_value_t *args, njs_uint_t nargs);
182189
static void ngx_http_js_handle_event(ngx_http_request_t *r,
183190
njs_vm_event_t vm_event, njs_value_t *args, njs_uint_t nargs);
184191

@@ -576,11 +583,15 @@ static njs_vm_ops_t ngx_http_js_ops = {
576583

577584
static uintptr_t ngx_http_js_uptr[] = {
578585
offsetof(ngx_http_request_t, connection),
586+
(uintptr_t) ngx_http_js_pool,
587+
(uintptr_t) ngx_http_js_resolver,
588+
(uintptr_t) ngx_http_js_resolver_timeout,
589+
(uintptr_t) ngx_http_js_handle_event,
579590
};
580591

581592

582593
static njs_vm_meta_t ngx_http_js_metas = {
583-
.size = 1,
594+
.size = 5,
584595
.values = ngx_http_js_uptr
585596
};
586597

@@ -2754,7 +2765,7 @@ ngx_http_js_subrequest_done(ngx_http_request_t *r, void *data, ngx_int_t rc)
27542765
return NGX_ERROR;
27552766
}
27562767

2757-
ngx_http_js_handle_event(r->parent, vm_event, njs_value_arg(&reply), 1);
2768+
ngx_http_js_handle_vm_event(r->parent, vm_event, njs_value_arg(&reply), 1);
27582769

27592770
return NGX_OK;
27602771
}
@@ -2895,24 +2906,48 @@ ngx_http_js_clear_timer(njs_external_ptr_t external, njs_host_event_t event)
28952906
static void
28962907
ngx_http_js_timer_handler(ngx_event_t *ev)
28972908
{
2898-
ngx_connection_t *c;
28992909
ngx_http_request_t *r;
29002910
ngx_http_js_event_t *js_event;
29012911

29022912
js_event = (ngx_http_js_event_t *) ev->data;
29032913

29042914
r = js_event->request;
29052915

2906-
c = r->connection;
2907-
29082916
ngx_http_js_handle_event(r, js_event->vm_event, NULL, 0);
2917+
}
2918+
2919+
2920+
static ngx_pool_t *
2921+
ngx_http_js_pool(njs_vm_t *vm, ngx_http_request_t *r)
2922+
{
2923+
return r->pool;
2924+
}
29092925

2910-
ngx_http_run_posted_requests(c);
2926+
2927+
static ngx_resolver_t *
2928+
ngx_http_js_resolver(njs_vm_t *vm, ngx_http_request_t *r)
2929+
{
2930+
ngx_http_core_loc_conf_t *clcf;
2931+
2932+
clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
2933+
2934+
return clcf->resolver;
2935+
}
2936+
2937+
2938+
static ngx_msec_t
2939+
ngx_http_js_resolver_timeout(njs_vm_t *vm, ngx_http_request_t *r)
2940+
{
2941+
ngx_http_core_loc_conf_t *clcf;
2942+
2943+
clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
2944+
2945+
return clcf->resolver_timeout;
29112946
}
29122947

29132948

29142949
static void
2915-
ngx_http_js_handle_event(ngx_http_request_t *r, njs_vm_event_t vm_event,
2950+
ngx_http_js_handle_vm_event(ngx_http_request_t *r, njs_vm_event_t vm_event,
29162951
njs_value_t *args, njs_uint_t nargs)
29172952
{
29182953
njs_int_t rc;
@@ -2925,6 +2960,10 @@ ngx_http_js_handle_event(ngx_http_request_t *r, njs_vm_event_t vm_event,
29252960

29262961
rc = njs_vm_run(ctx->vm);
29272962

2963+
ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2964+
"http js post event handler rc: %i event: %p",
2965+
(ngx_int_t) rc, vm_event);
2966+
29282967
if (rc == NJS_ERROR) {
29292968
njs_vm_retval_string(ctx->vm, &exception);
29302969

@@ -2940,6 +2979,16 @@ ngx_http_js_handle_event(ngx_http_request_t *r, njs_vm_event_t vm_event,
29402979
}
29412980

29422981

2982+
static void
2983+
ngx_http_js_handle_event(ngx_http_request_t *r, njs_vm_event_t vm_event,
2984+
njs_value_t *args, njs_uint_t nargs)
2985+
{
2986+
ngx_http_js_handle_vm_event(r, vm_event, args, nargs);
2987+
2988+
ngx_http_run_posted_requests(r->connection);
2989+
}
2990+
2991+
29432992
static char *
29442993
ngx_http_js_init_main_conf(ngx_conf_t *cf, void *conf)
29452994
{

nginx/ngx_js.c

+28
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include <ngx_config.h>
1010
#include <ngx_core.h>
1111
#include "ngx_js.h"
12+
#include "ngx_js_fetch.h"
1213

1314

1415
static njs_external_t ngx_js_ext_core[] = {
@@ -50,6 +51,17 @@ static njs_external_t ngx_js_ext_core[] = {
5051
.magic32 = NGX_LOG_ERR,
5152
}
5253
},
54+
55+
{
56+
.flags = NJS_EXTERN_METHOD,
57+
.name.string = njs_str("fetch"),
58+
.writable = 1,
59+
.configurable = 1,
60+
.enumerable = 1,
61+
.u.method = {
62+
.native = ngx_js_ext_fetch,
63+
}
64+
},
5365
};
5466

5567

@@ -117,10 +129,16 @@ ngx_js_string(njs_vm_t *vm, njs_value_t *value, njs_str_t *str)
117129
ngx_int_t
118130
ngx_js_core_init(njs_vm_t *vm, ngx_log_t *log)
119131
{
132+
ngx_int_t rc;
120133
njs_int_t ret, proto_id;
121134
njs_str_t name;
122135
njs_opaque_value_t value;
123136

137+
rc = ngx_js_fetch_init(vm, log);
138+
if (rc != NGX_OK) {
139+
return NGX_ERROR;
140+
}
141+
124142
proto_id = njs_vm_external_prototype(vm, ngx_js_ext_core,
125143
njs_nitems(ngx_js_ext_core));
126144
if (proto_id < 0) {
@@ -177,6 +195,16 @@ ngx_js_ext_constant(njs_vm_t *vm, njs_object_prop_t *prop,
177195
}
178196

179197

198+
njs_int_t
199+
ngx_js_ext_boolean(njs_vm_t *vm, njs_object_prop_t *prop,
200+
njs_value_t *value, njs_value_t *setval, njs_value_t *retval)
201+
{
202+
njs_value_boolean_set(retval, njs_vm_prop_magic32(prop));
203+
204+
return NJS_OK;
205+
}
206+
207+
180208
njs_int_t
181209
ngx_js_ext_log(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
182210
njs_index_t level)

nginx/ngx_js.h

+22-2
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,28 @@
2020
#define NGX_JS_BUFFER 2
2121

2222
#define NGX_JS_PROTO_MAIN 0
23+
#define NGX_JS_PROTO_RESPONSE 1
2324

2425

25-
#define ngx_external_connection(vm, ext) \
26-
(*((ngx_connection_t **) ((u_char *) ext + njs_vm_meta(vm, 0))))
26+
typedef ngx_pool_t *(*ngx_external_pool_pt)(njs_vm_t *vm, njs_external_ptr_t e);
27+
typedef void (*ngx_js_event_handler_pt)(njs_external_ptr_t e,
28+
njs_vm_event_t vm_event, njs_value_t *args, njs_uint_t nargs);
29+
typedef ngx_resolver_t *(*ngx_external_resolver_pt)(njs_vm_t *vm,
30+
njs_external_ptr_t e);
31+
typedef ngx_msec_t (*ngx_external_resolver_timeout_pt)(njs_vm_t *vm,
32+
njs_external_ptr_t e);
33+
34+
35+
#define ngx_external_connection(vm, e) \
36+
(*((ngx_connection_t **) ((u_char *) (e) + njs_vm_meta(vm, 0))))
37+
#define ngx_external_pool(vm, e) \
38+
((ngx_external_pool_pt) njs_vm_meta(vm, 1))(vm, e)
39+
#define ngx_external_resolver(vm, e) \
40+
((ngx_external_resolver_pt) njs_vm_meta(vm, 2))(vm, e)
41+
#define ngx_external_resolver_timeout(vm, e) \
42+
((ngx_external_resolver_timeout_pt) njs_vm_meta(vm, 3))(vm, e)
43+
#define ngx_external_event_handler(vm, e) \
44+
((ngx_js_event_handler_pt) njs_vm_meta(vm, 4))
2745

2846

2947
#define ngx_js_prop(vm, type, value, start, len) \
@@ -41,6 +59,8 @@ njs_int_t ngx_js_ext_string(njs_vm_t *vm, njs_object_prop_t *prop,
4159
njs_value_t *value, njs_value_t *setval, njs_value_t *retval);
4260
njs_int_t ngx_js_ext_constant(njs_vm_t *vm, njs_object_prop_t *prop,
4361
njs_value_t *value, njs_value_t *setval, njs_value_t *retval);
62+
njs_int_t ngx_js_ext_boolean(njs_vm_t *vm, njs_object_prop_t *prop,
63+
njs_value_t *value, njs_value_t *setval, njs_value_t *retval);
4464

4565
ngx_int_t ngx_js_core_init(njs_vm_t *vm, ngx_log_t *log);
4666

0 commit comments

Comments
 (0)