On 19.01.2021 18:44, Grzegorz Kulewski wrote:
Hello,

Is it possible to (at least) add (or better also) filter response headers (like 
for example setting or modifying or deleting cookies, of course without harming 
other cookies set by the upstream) dynamically from njs after it is returned 
from the upstream (or cache) and before it is sent to the client?

I think something like that is possible with lua but I would really like to 
avoid using 3rd party modules and just go the njs route.

If not possible - is there any workaround? And/or can it be easily added in 
next release(s)?

Thank you in advance.


Hi Grzegorz,

Please, clarify what are you trying to do with Set-Cookie headers? Consider built-in directives for a typical modifications like proxy_cookie_domain, proxy_cookie_flags etc.

If nothing is applicable take a look at the following example:

nginx.conf:

js_import main from http.js;
js_set $modify_cookies  main.modify_cookies;

location /modify_cookies {
            add_header _ $modify_cookies;
            proxy_pass http://127.0.0.1:8080;
 }

server {
        listen       127.0.0.1:8080;

        location /modify_cookies {
            add_header Set-Cookie "XXXXXX";
            add_header Set-Cookie "BB";
            add_header Set-Cookie "YYYYYYY";
            return 200;
        }
    }

http.js:
function modify_cookies(r) {
    var cookies = r.headersOut['Set-Cookie'];
    r.headersOut['Set-Cookie'] = cookies.filter(v=>v.length > Number(r.args.len));
    return "";
}


curl http://localhost:8000/modify_cookies?len=1 -v
...
< Set-Cookie: XXXXXX
< Set-Cookie: BB
< Set-Cookie: YYYYYYY



curl http://localhost:8000/modify_cookies?len=3 -v
...
< Set-Cookie: XXXXXX
< Set-Cookie: YYYYYYY


This works because arbitrary njs code can be executed when nginx evaluates a variable at runtime. The trick is to find an appropriate directives which supports variables and which is evaluated at appropriate moment of request processing. So, in the example an auxiliary variable is used to inject njs code after an upstream data is processed but response headers are not sent to a client yet.



_______________________________________________
nginx mailing list
nginx@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx

Reply via email to