Let's say we want to change a response from a upstream, what we can do is to use Lua+nginx on the body_filter_by_lua_block
phase, here's a snippet of that.
server {
listen 8181;
location /media {
alias /media/;
}
}
server {
listen 8080;
location /media {
proxy_pass http://localhost:8181;
# we need to keep this url since we're going to rewrite
set_by_lua_block $original_uri { return ngx.var.uri }
# when the Lua code may change the length of the response body
header_filter_by_lua_block { ngx.header.content_length = nil }
# removing (rewriting) the filters
rewrite_by_lua_block {
local uri = ngx.re.sub(ngx.var.uri, "^/media/(.*)/hls/(.*)$", "/media/hls/$2")
ngx.req.set_uri(uri)
}
# applying the bandwidth min filter
# but we can use the ngx.var.original_uri to build/select the filters
body_filter_by_lua_block {
local modified_manifest = filtering(ngx.arg[1])
ngx.arg[1] = modified_manifest
ngx.arg[2] = true
}
}
This works just fine! But the thing is, in this way the response will be using chunked transfer, and some clients can not deal with chunked response, do you know how can I overcome that?
I solved this problem by issuing a sub request and fulfilling the content length header.