From: Dmitry Volyntsev Date: Thu, 22 Jun 2023 22:40:36 +0000 (-0700) Subject: Fetch: fixed setting of Content-Type header. X-Git-Tag: 0.8.0~13 X-Git-Url: http://www.kaiwu.me/postgresql/commit/?a=commitdiff_plain;h=5b463b8050377216ad4197cd1e35bb69b35b77e9;p=njs.git Fetch: fixed setting of Content-Type header. Previously, Content-Type was set unconditionally to "text/plain;charset=UTF-8" when fetch request contained a string body. This may overlap with user's Content-Type. The fix is to set the header only if it was not set before. This fixes #654 issue on Github. --- diff --git a/nginx/ngx_js_fetch.c b/nginx/ngx_js_fetch.c index 24a58e03..3e8e9081 100644 --- a/nginx/ngx_js_fetch.c +++ b/nginx/ngx_js_fetch.c @@ -65,6 +65,7 @@ typedef struct { GUARD_RESPONSE, } guard; ngx_list_t header_list; + ngx_js_tb_elt_t *content_type; } ngx_js_headers_t; @@ -1951,6 +1952,7 @@ ngx_js_request_constructor(njs_vm_t *vm, ngx_js_request_t *request, * request->cache_mode = CACHE_MODE_DEFAULT; * request->credentials = CREDENTIALS_SAME_ORIGIN; * request->mode = MODE_NO_CORS; + * request->headers.content_type = NULL; */ ngx_memzero(request, sizeof(ngx_js_request_t)); @@ -2092,6 +2094,9 @@ ngx_js_request_constructor(njs_vm_t *vm, ngx_js_request_t *request, * just allocating a new one. */ + ngx_memset(&request->headers, 0, sizeof(ngx_js_headers_t)); + request->headers.guard = GUARD_REQUEST; + rc = ngx_list_init(&request->headers.header_list, pool, 4, sizeof(ngx_js_tb_elt_t)); if (rc != NGX_OK) { @@ -2112,7 +2117,9 @@ ngx_js_request_constructor(njs_vm_t *vm, ngx_js_request_t *request, return NJS_ERROR; } - if (njs_value_is_string(value)) { + if (request->headers.content_type == NULL + && njs_value_is_string(value)) + { ret = ngx_js_headers_append(vm, &request->headers, (u_char *) "Content-Type", njs_length("Content-Type"), @@ -2303,6 +2310,12 @@ ngx_js_headers_append(njs_vm_t *vm, ngx_js_headers_t *headers, h->value.len = vlen; h->next = NULL; + if (len == njs_strlen("Content-Type") + && ngx_strncasecmp(name, (u_char *) "Content-Type", len) == 0) + { + headers->content_type = h; + } + return NJS_OK; } @@ -3334,6 +3347,13 @@ ngx_headers_js_ext_delete(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, } } + if (name.length == njs_strlen("Content-Type") + && ngx_strncasecmp(name.start, (u_char *) "Content-Type", name.length) + == 0) + { + headers->content_type = NULL; + } + njs_value_undefined_set(retval); return NJS_OK; diff --git a/nginx/t/js_fetch_objects.t b/nginx/t/js_fetch_objects.t index edc3be57..c8001823 100644 --- a/nginx/t/js_fetch_objects.t +++ b/nginx/t/js_fetch_objects.t @@ -373,6 +373,27 @@ $t->write_file('test.js', < { + var r = new Request("http://nginx.org", + {body: 'ABC', + headers: {'Content-Type': 'text/html'}}); + return r.headers.get('Content-Type'); + }, 'text/html'], + ['user content type from Headers()', async () => { + var h = new Headers(); + h.append('Content-Type', 'text/html'); + var r = new Request("http://nginx.org", + {body: 'ABC', headers: h}); + return r.headers.get('Content-Type'); + }, 'text/html'], + ['user content type deleted', async () => { + var h = new Headers(); + h.append('Content-Type', 'text/html'); + h.delete('Content-Type'); + var r = new Request("http://nginx.org", + {body: 'ABC', headers: h}); + return r.headers.get('Content-Type'); + }, 'text/plain;charset=UTF-8'], ['GET body', () => { try { var r = new Request("http://nginx.org", {body: 'ABC'});