]> git.kaiwu.me - njs.git/commitdiff
HTTP: fixed setting of Date header.
authorDmitry Volyntsev <xeioex@nginx.com>
Wed, 12 Jul 2023 02:12:34 +0000 (19:12 -0700)
committerDmitry Volyntsev <xeioex@nginx.com>
Wed, 12 Jul 2023 02:12:34 +0000 (19:12 -0700)
Previously, r.headersOut['Date'] setter did not update
r->headers_out.date. As a result a client might get two
Date headers.

nginx/ngx_http_js_module.c
nginx/t/js_headers.t

index 5f6c73da35706f1518b03ce10e0b51a333f47828..595a813d90a58111a3705c83d564678b767a3121 100644 (file)
@@ -125,6 +125,9 @@ static njs_int_t ngx_http_js_content_length122(njs_vm_t *vm,
 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_length(njs_vm_t *vm, ngx_http_request_t *r,
 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 @@ ngx_http_js_ext_header_out(njs_vm_t *vm, njs_object_prop_t *prop,
         { 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 @@ ngx_http_js_ext_header_out(njs_vm_t *vm, njs_object_prop_t *prop,
         { 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 },
@@ -1954,6 +1962,14 @@ ngx_http_js_content_type122(njs_vm_t *vm, ngx_http_request_t *r,
 }
 
 
+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)
@@ -3960,6 +3976,26 @@ ngx_http_js_content_type(njs_vm_t *vm, ngx_http_request_t *r,
 }
 
 
+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)
index 4146e3c3724194864fedefc583b47e53ede20f34..57a8a8081cf837a6e96fe26be282c80f7ac6a96e 100644 (file)
@@ -84,6 +84,10 @@ http {
             js_content test.content_encoding_arr;
         }
 
+        location /date {
+            js_content test.date;
+        }
+
         location /location {
             js_content test.location;
         }
@@ -245,6 +249,11 @@ $t->write_file('test.js', <<EOF);
         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 @@ $t->write_file('test.js', <<EOF);
                     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 @@ unlike(http_get('/location_sr'), qr/Location: \/location_sr/,
 
 }
 
+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 {