]> git.kaiwu.me - njs.git/commitdiff
Fetch: added default user agent.
authorDmitry Volyntsev <xeioex@nginx.com>
Thu, 16 Oct 2025 01:56:48 +0000 (18:56 -0700)
committerDmitry Volyntsev <xeioexception@gmail.com>
Mon, 27 Oct 2025 16:03:09 +0000 (09:03 -0700)
nginx/ngx_js_http.c
nginx/t/js_fetch.t

index 400d42d239929803fc7b051db3eeaa7b9bb3c550..9f150f0caa78a6144c866d2746c896436538b5d1 100644 (file)
@@ -24,6 +24,7 @@ typedef struct {
 
 
 #define ngx_js_http_version(major, minor)  ((major) * 1000 + (minor))
+#define NGX_JS_USER_AGENT  "nginx-js"
 
 
 static void ngx_js_http_resolve_handler(ngx_resolver_ctx_t *ctx);
@@ -1936,7 +1937,7 @@ ngx_js_fetch_build_request(ngx_js_http_t *http, ngx_js_request_t *request,
 {
     ngx_str_t         method;
     ngx_uint_t        i;
-    njs_bool_t        has_host;
+    njs_bool_t        has_host, has_user_agent;
     ngx_list_part_t  *part;
     ngx_js_tb_elt_t  *h;
 
@@ -1951,6 +1952,7 @@ ngx_js_fetch_build_request(ngx_js_http_t *http, ngx_js_request_t *request,
     njs_chb_append_literal(&http->chain, " HTTP/1.1" CRLF);
 
     has_host = 0;
+    has_user_agent = 0;
     part = &request->headers.header_list.part;
     h = part->elts;
 
@@ -1977,7 +1979,17 @@ ngx_js_fetch_build_request(ngx_js_http_t *http, ngx_js_request_t *request,
             njs_chb_append_literal(&http->chain, "Host: ");
             njs_chb_append(&http->chain, h[i].value.data, h[i].value.len);
             njs_chb_append_literal(&http->chain, CRLF);
-            break;
+            continue;
+        }
+
+        if (h[i].key.len == 10
+            && ngx_strncasecmp(h[i].key.data, (u_char *) "User-Agent", 10) == 0)
+        {
+            has_user_agent = 1;
+            njs_chb_append_literal(&http->chain, "User-Agent: ");
+            njs_chb_append(&http->chain, h[i].value.data, h[i].value.len);
+            njs_chb_append_literal(&http->chain, CRLF);
+            continue;
         }
     }
 
@@ -1992,6 +2004,13 @@ ngx_js_fetch_build_request(ngx_js_http_t *http, ngx_js_request_t *request,
         njs_chb_append_literal(&http->chain, CRLF);
     }
 
+    if (!has_user_agent) {
+        njs_chb_append_literal(&http->chain, "User-Agent: ");
+        njs_chb_append(&http->chain, (u_char *) NGX_JS_USER_AGENT,
+                       sizeof(NGX_JS_USER_AGENT) - 1);
+        njs_chb_append_literal(&http->chain, CRLF);
+    }
+
     ngx_js_fetch_append_request_headers(&http->chain, request);
 
     if (!http->keepalive) {
index 76d9238d215bbc1fd6a8fae96c7b47c0c3d8ed6c..d26e664a84d80b878031a2d107d272ddd9a19944 100644 (file)
@@ -92,6 +92,10 @@ http {
             js_content test.host_header;
         }
 
+        location /user_agent_header {
+            js_content test.user_agent_header;
+        }
+
         location /header_iter {
             js_content test.header_iter;
         }
@@ -122,6 +126,10 @@ http {
         location /host {
             return 200 $http_host;
         }
+
+        location /user_agent {
+            return 200 $http_user_agent;
+        }
     }
 }
 
@@ -318,6 +326,17 @@ $t->write_file('test.js', <<EOF);
         r.return(200, body);
     }
 
+    async function user_agent_header(r) {
+        let opts = {};
+        if (r.args.ua) {
+            opts.headers = { 'User-Agent': r.args.ua };
+        }
+
+        const reply = await ngx.fetch(`http://127.0.0.1:$p1/user_agent`, opts);
+        const body = await reply.text();
+        r.return(200, body);
+    }
+
     async function body_special(r) {
         let opts = {};
 
@@ -411,12 +430,13 @@ $t->write_file('test.js', <<EOF);
 
      export default {njs: test_njs, body, broken, broken_response, body_special,
                      chain, chunked_ok, chunked_fail, header, header_iter,
-                     host_header, multi, loc, property, body_content_length };
+                     host_header, multi, loc, property, body_content_length,
+                     user_agent_header };
 EOF
 
 $t->try_run('no njs.fetch');
 
-$t->plan(38);
+$t->plan(40);
 
 $t->run_daemon(\&http_daemon, port(8082));
 $t->waitforsocket('127.0.0.1:' . port(8082));
@@ -527,6 +547,12 @@ like(http_get('/body_content_length'), qr/200 OK/s,
 
 }
 
+like(http_get('/user_agent_header'),
+       qr/200 OK.*nginx-js\/1.0$/s,
+       'fetch default user-agent header');
+like(http_get('/user_agent_header?ua=My-User-Agent'),
+       qr/200 OK.*My-User-Agent$/s, 'fetch user-agent header');
+
 ###############################################################################
 
 sub has_version {