0

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?

Leandro Moreira
  • 549
  • 1
  • 7
  • 12

1 Answers1

0

I solved this problem by issuing a sub request and fulfilling the content length header.

    location /mmedia {
         content_by_lua_block {
            local uri = ngx.re.sub(ngx.var.uri, "^/mmedia/(.*)/hls/(.*)$", "/media/$1/hls/$2")
            local res = ngx.location.capture(uri)
            if res then
              ngx.header.content_length = #res.body
              ngx.print(res.body)
            end
         }
    }
Leandro Moreira
  • 549
  • 1
  • 7
  • 12