From 15ab34f9829005d8e1b2b4f309823aaddad69a65 Mon Sep 17 00:00:00 2001 From: Dmitry Volyntsev Date: Thu, 29 Feb 2024 20:56:56 -0800 Subject: [PATCH] HTTP: allowing to set Server header. --- nginx/ngx_http_js_module.c | 38 ++++++++++++++++++++++++++++++++++++++ nginx/t/js_headers.t | 22 ++++++++++++++++++++-- 2 files changed, 58 insertions(+), 2 deletions(-) diff --git a/nginx/ngx_http_js_module.c b/nginx/ngx_http_js_module.c index bd77e853..e6c05eb4 100644 --- a/nginx/ngx_http_js_module.c +++ b/nginx/ngx_http_js_module.c @@ -149,6 +149,9 @@ static njs_int_t ngx_http_js_last_modified122(njs_vm_t *vm, static njs_int_t ngx_http_js_location122(njs_vm_t *vm, ngx_http_request_t *r, ngx_list_t *headers, njs_str_t *name, njs_value_t *setval, njs_value_t *retval); +static njs_int_t ngx_http_js_server122(njs_vm_t *vm, ngx_http_request_t *r, + ngx_list_t *headers, njs_str_t *name, njs_value_t *setval, + njs_value_t *retval); #endif static njs_int_t ngx_http_js_ext_keys_header_out(njs_vm_t *vm, njs_value_t *value, njs_value_t *keys); @@ -255,6 +258,9 @@ static njs_int_t ngx_http_js_last_modified(njs_vm_t *vm, ngx_http_request_t *r, static njs_int_t ngx_http_js_location(njs_vm_t *vm, ngx_http_request_t *r, unsigned flags, njs_str_t *name, njs_value_t *setval, njs_value_t *retval); +static njs_int_t ngx_http_js_server(njs_vm_t *vm, ngx_http_request_t *r, + unsigned flags, njs_str_t *name, njs_value_t *setval, + njs_value_t *retval); static ngx_pool_t *ngx_http_js_pool(njs_vm_t *vm, ngx_http_request_t *r); static ngx_resolver_t *ngx_http_js_resolver(njs_vm_t *vm, @@ -1617,6 +1623,7 @@ ngx_http_js_ext_header_out(njs_vm_t *vm, njs_object_prop_t *prop, { njs_str("Expires"), ngx_http_js_header_single }, { njs_str("Last-Modified"), ngx_http_js_last_modified122 }, { njs_str("Location"), ngx_http_js_location122 }, + { njs_str("Server"), ngx_http_js_server122 }, { njs_str("Set-Cookie"), ngx_http_js_header_array }, { njs_str("Retry-After"), ngx_http_js_header_single }, { njs_str(""), ngx_http_js_header_generic }, @@ -1630,6 +1637,7 @@ ngx_http_js_ext_header_out(njs_vm_t *vm, njs_object_prop_t *prop, { njs_str("Expires"), NJS_HEADER_SINGLE, ngx_http_js_header_out }, { njs_str("Last-Modified"), 0, ngx_http_js_last_modified }, { njs_str("Location"), 0, ngx_http_js_location }, + { njs_str("Server"), 0, ngx_http_js_server }, { njs_str("Set-Cookie"), NJS_HEADER_ARRAY, ngx_http_js_header_out }, { njs_str("Retry-After"), NJS_HEADER_SINGLE, ngx_http_js_header_out }, { njs_str(""), 0, ngx_http_js_header_out }, @@ -2065,6 +2073,14 @@ ngx_http_js_location122(njs_vm_t *vm, ngx_http_request_t *r, { return ngx_http_js_location(vm, r, 0, v, setval, retval); } + + +static njs_int_t +ngx_http_js_server122(njs_vm_t *vm, ngx_http_request_t *r, + ngx_list_t *headers, njs_str_t *v, njs_value_t *setval, njs_value_t *retval) +{ + return ngx_http_js_server(vm, r, 0, v, setval, retval); +} #endif @@ -4160,6 +4176,28 @@ ngx_http_js_location(njs_vm_t *vm, ngx_http_request_t *r, unsigned flags, } +static njs_int_t +ngx_http_js_server(njs_vm_t *vm, ngx_http_request_t *r, unsigned flags, + njs_str_t *v, njs_value_t *setval, njs_value_t *retval) +{ + njs_int_t rc; + ngx_table_elt_t *h; + + rc = ngx_http_js_header_out_special(vm, r, v, setval, retval, &h); + if (rc == NJS_ERROR) { + return NJS_ERROR; + } + + if (setval != NULL || retval == NULL) { + r->headers_out.server = h; + } + + return NJS_OK; + + return NJS_OK; +} + + static void ngx_http_js_periodic_handler(ngx_event_t *ev) { diff --git a/nginx/t/js_headers.t b/nginx/t/js_headers.t index f2f96569..787b5520 100644 --- a/nginx/t/js_headers.t +++ b/nginx/t/js_headers.t @@ -160,6 +160,10 @@ http { js_content test.copy_subrequest_hdrs; } + location /server { + js_content test.server; + } + location = /subrequest { internal; @@ -435,6 +439,11 @@ $t->write_file('test.js', <write_file('test.js', <try_run('no njs')->plan(46); +$t->try_run('no njs')->plan(49); ############################################################################### @@ -620,6 +629,15 @@ like(http_get('/last_modified'), } +TODO: { +local $TODO = 'not yet' unless has_version('0.8.4'); + +like(http_get('/date'), qr/Server: nginx/, 'normal server'); +like(http_get('/server'), qr/Server: Foo/, 'set server'); +unlike(http_get('/server'), qr/Server: nginx/, 'set server 2'); + +} + ############################################################################### sub has_version { -- 2.47.3