-
Bug
-
Resolution: Won't Do
-
Major
-
None
-
None
-
False
-
False
-
Not Started
-
Not Started
-
Not Started
-
Not Started
-
Not Started
-
Not Started
-
+
When content-caching is defined, the If-match header is always used, so the
test[0] without it, it's working correctly, but when content-caching is enabled,
the nginx-filter is not working as expected:
A sample scenario is like this:
master_process off; worker_processes 1; daemon off; error_log /dev/stdout debug; events { accept_mutex off; worker_connections 5000; } http { proxy_cache_path /tmp/cache levels=1:2 keys_zone=apicast_cache:10m; upstream backend { server 127.0.0.1:8081; balancer_by_lua_block { ngx.log(ngx.ERR, "Setting header on balancer") ngx.req.set_header("if-match", "anything") } keepalive 10; # connection pool } server { access_log off; listen 8081; resolver 8.8.8.8; location / { rewrite_by_lua_block { local h = ngx.req.get_headers() ngx.req.clear_header("if-match") ngx.say(require("cjson").encode(h)) } } } server { access_log off; listen 8080; resolver 8.8.8.8; location / { rewrite_by_lua_block { ngx.req.clear_header("if-match") } content_by_lua_block { ngx.exec("@upstream") } } location @upstream { set $cache_request 'false'; set $cache_zone 'off'; proxy_cache apicast_cache; proxy_cache_key $scheme$request_method$proxy_host$request_uri; proxy_no_cache "false"; proxy_cache_valid 200 302 1m; add_header X-Cache-Status $upstream_cache_status; proxy_pass http://backend; proxy_http_version 1.1; } } }
So, when doing the send header, it'll use the
ngx_http_not_modified_header_filter, and things will mess up when
content-caching is enabled.
The backtrace looks like this when is set, and the main issue is the
`ngx_http_send_header` function, that applies the filter that are defined on the
`ngx_http_not_modified_filter_module.c`:
(gdb) bt #0 ngx_http_not_modified_header_filter (r=0x55c21900e990) at src/http/modules/ngx_http_not_modified_filter_module.c:71 #1 ngx_http_not_modified_header_filter (r=0x55c21900e990) at src/http/modules/ngx_http_not_modified_filter_module.c:55 #2 0x000055c216ff8069 in ngx_http_lua_send_header_if_needed (ctx=0x55c21900f780, r=<optimized out>) at ../ngx_lua-0.10.19/src/ngx_http_lua_util.c:549 #3 ngx_http_lua_send_header_if_needed (r=<optimized out>, ctx=<optimized out>) at ../ngx_lua-0.10.19/src/ngx_http_lua_util.c:524 #4 0x000055c216ff80e8 in ngx_http_lua_send_chain_link (r=r@entry=0x55c21900e990, ctx=ctx@entry=0x55c21900f780, in=in@entry=0x55c21900fd40) at ../ngx_lua-0.10.19/src/ngx_http_lua_util.c:591 #5 0x000055c216ff8327 in ngx_http_lua_send_chain_link (r=r@entry=0x55c21900e990, ctx=ctx@entry=0x55c21900f780, in=in@entry=0x55c21900fd40) at ../ngx_lua-0.10.19/src/ngx_http_lua_util.c:569 #6 0x000055c216fec479 in ngx_http_lua_ngx_echo (L=0x7f4f3d2a7ab0, newline=<optimized out>) at ../ngx_lua-0.10.19/src/ngx_http_lua_output.c:239 #7 0x00007f4f3d726f75 in lj_BC_FUNCC () from /usr/local/openresty/luajit/lib/libluajit-5.1.so.2 #8 0x000055c216ff9a52 in ngx_http_lua_run_thread (L=L@entry=0x7f4f3d2d0380, r=r@entry=0x55c21900e990, ctx=ctx@entry=0x55c21900f780, nrets=<optimized out>, nrets@entry=0) at ../ngx_lua-0.10.19/src/ngx_http_lua_util.c:1167 #9 0x000055c216ffd7a8 in ngx_http_lua_rewrite_by_chunk (L=0x7f4f3d2d0380, r=0x55c21900e990) at ../ngx_lua-0.10.19/src/ngx_http_lua_rewriteby.c:337 #10 0x000055c216ffd9ee in ngx_http_lua_rewrite_handler (r=0x55c21900e990) at ../ngx_lua-0.10.19/src/ngx_http_lua_rewriteby.c:162 #11 0x000055c216f48b9d in ngx_http_core_rewrite_phase (r=0x55c21900e990, ph=<optimized out>) at src/http/ngx_http_core_module.c:932 #12 0x000055c216f443e5 in ngx_http_core_run_phases (r=r@entry=0x55c21900e990) at src/http/ngx_http_core_module.c:878 #13 0x000055c216f444a4 in ngx_http_handler (r=r@entry=0x55c21900e990) at src/http/ngx_http_core_module.c:861 #14 0x000055c216f4f1c5 in ngx_http_process_request (r=r@entry=0x55c21900e990) at src/http/ngx_http_request.c:2081 #15 0x000055c216f4f747 in ngx_http_process_request_headers (rev=<optimized out>) at src/http/ngx_http_request.c:1483 #16 0x000055c216f4fb24 in ngx_http_process_request_line (rev=0x7f4f3c6fe200) at src/http/ngx_http_request.c:1154 #17 0x000055c216f35996 in ngx_epoll_process_events (cycle=<optimized out>, timer=<optimized out>, flags=<optimized out>) at src/event/modules/ngx_epoll_module.c:901 --Type <RET> for more, q to quit, c to continue without paging--z #18 0x000055c216f2b966 in ngx_process_events_and_timers (cycle=cycle@entry=0x55c219009950) at src/event/ngx_event.c:257 #19 0x000055c216f34e68 in ngx_single_process_cycle (cycle=0x55c219009950) at src/os/unix/ngx_process_cycle.c:323 #20 0x000055c216f09e6d in main (argc=<optimized out>, argv=<optimized out>) at src/core/nginx.c:382 (gdb)
APICAst config to replicate this:
{ "services": [ { "id": 42, "backend_version": "1", "backend_authentication_type": "service_token", "backend_authentication_value": "token-value", "proxy": { "hosts": [ "eloy", "one", "one.com" ], "api_backend": "https://echo-api.3scale.net", "proxy_rules": [ { "pattern": "/", "http_method": "GET", "metric_system_name": "hits", "delta": 2 }, { "pattern": "/", "http_method": "POST", "metric_system_name": "hits", "delta": 2 } ], "policy_chain": [ { "name": "apicast.policy.nginx_filters", "configuration": { "headers": [ { "name": "If-Match", "append": true } ] } }, { "name": "content_caching", "version": "builtin", "configuration": { "rules": [ { "cache": true, "header": "X-Cache-Status", "condition": { "combine_op": "and", "operations": [ { "left": "oo", "op": "==", "right": "oo" } ] } } ] } }, { "name": "apicast.policy.apicast" } ] } } ] }
[0] https://github.com/3scale/APIcast/blob/master/t/apicast-policy-nginx_filters.t#L94-L148
- relates to
-
THREESCALE-6704 APIcast is stripping away If-Match and If-None-Match headers from requests
- Closed