Mercurial > njs
changeset 2180:a35035c52201
HTTP: fixed setting of Date header.
Previously, r.headersOut['Date'] setter did not update
r->headers_out.date. As a result a client might get two
Date headers.
| author | Dmitry Volyntsev <xeioex@nginx.com> |
|---|---|
| date | Tue, 11 Jul 2023 19:12:34 -0700 |
| parents | ac56314cc3be |
| children | 3af6c729b7cb |
| files | nginx/ngx_http_js_module.c nginx/t/js_headers.t |
| diffstat | 2 files changed, 56 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/nginx/ngx_http_js_module.c Mon Jul 10 17:57:45 2023 -0700 +++ b/nginx/ngx_http_js_module.c Tue Jul 11 19:12:34 2023 -0700 @@ -125,6 +125,9 @@ static njs_int_t ngx_http_js_content_type122(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_date122(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_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); @@ -222,6 +225,9 @@ static njs_int_t ngx_http_js_content_type(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_date(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_location(njs_vm_t *vm, ngx_http_request_t *r, unsigned flags, njs_str_t *name, njs_value_t *setval, njs_value_t *retval); @@ -1526,6 +1532,7 @@ { njs_str("Content-Type"), ngx_http_js_content_type122 }, { njs_str("Content-Length"), ngx_http_js_content_length122 }, { njs_str("Content-Encoding"), ngx_http_js_content_encoding122 }, + { njs_str("Date"), ngx_http_js_date122 }, { njs_str("Etag"), ngx_http_js_header_single }, { njs_str("Expires"), ngx_http_js_header_single }, { njs_str("Last-Modified"), ngx_http_js_header_single }, @@ -1538,6 +1545,7 @@ { njs_str("Content-Encoding"), 0, ngx_http_js_content_encoding }, { njs_str("Content-Length"), 0, ngx_http_js_content_length }, { njs_str("Content-Type"), 0, ngx_http_js_content_type }, + { njs_str("Date"), 0, ngx_http_js_date }, { njs_str("Etag"), NJS_HEADER_SINGLE, ngx_http_js_header_out }, { njs_str("Expires"), NJS_HEADER_SINGLE, ngx_http_js_header_out }, { njs_str("Last-Modified"), NJS_HEADER_SINGLE, ngx_http_js_header_out }, @@ -1955,6 +1963,14 @@ static njs_int_t +ngx_http_js_date122(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_date(vm, r, 0, v, setval, retval); +} + + +static njs_int_t ngx_http_js_location122(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) { @@ -3961,6 +3977,26 @@ static njs_int_t +ngx_http_js_date(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.date = h; + } + + return NJS_OK; +} + + +static njs_int_t ngx_http_js_location(njs_vm_t *vm, ngx_http_request_t *r, unsigned flags, njs_str_t *v, njs_value_t *setval, njs_value_t *retval) {
--- a/nginx/t/js_headers.t Mon Jul 10 17:57:45 2023 -0700 +++ b/nginx/t/js_headers.t Tue Jul 11 19:12:34 2023 -0700 @@ -84,6 +84,10 @@ js_content test.content_encoding_arr; } + location /date { + js_content test.date; + } + location /location { js_content test.location; } @@ -245,6 +249,11 @@ r.return(200); } + function date(r) { + r.headersOut['Date'] = 'Sun, 09 Sep 2001 01:46:40 GMT'; + r.return(200); + } + function location(r) { if (njs.version_number >= 0x000705) { var lc = r.headersOut['Location']; @@ -437,12 +446,13 @@ hdr_in, raw_hdr_in, hdr_sorted_keys, foo_in, ifoo_in, hdr_out, raw_hdr_out, hdr_out_array, hdr_out_single, hdr_out_set_cookie, ihdr_out, hdr_out_special_set, - copy_subrequest_hdrs, subrequest, location, location_sr}; + copy_subrequest_hdrs, subrequest, date, location, + location_sr}; EOF -$t->try_run('no njs')->plan(44); +$t->try_run('no njs')->plan(45); ############################################################################### @@ -590,6 +600,14 @@ } +TODO: { +local $TODO = 'not yet' unless has_version('0.8.1'); + +like(http_get('/date'), qr/Date: Sun, 09 Sep 2001 01:46:40 GMT/, + 'set date'); + +} + ############################################################################### sub has_version {
