1

我正在使用 Apache + mod_lua 制作一个简单的“输出”过滤器原型。如何通过 LUA 在应用的其他本​​机输出过滤器结束时读取响应正文?例如,我能否获得将发送给客户端的实际响应?

4

1 回答 1

2

该手册对此有一些很好的指导:

http://httpd.apache.org/docs/current/mod/mod_lua.html#modifying_buckets

使用 Lua 过滤器修改内容 通过 LuaInputFilter 或 LuaOutputFilter 实现的过滤器函数被设计为三阶段非阻塞函数,使用协程暂停和恢复函数,因为桶被发送到过滤器链。这样一个函数的核心结构是:

function filter(r)
    -- Our first yield is to signal that we are ready to receive buckets.
    -- Before this yield, we can set up our environment, check for conditions,
    -- and, if we deem it necessary, decline filtering a request alltogether:
    if something_bad then
        return -- This would skip this filter.
    end
    -- Regardless of whether we have data to prepend, a yield MUST be called here.
    -- Note that only output filters can prepend data. Input filters must use the 
    -- final stage to append data to the content.
    coroutine.yield([optional header to be prepended to the content])

    -- After we have yielded, buckets will be sent to us, one by one, and we can 
    -- do whatever we want with them and then pass on the result.
    -- Buckets are stored in the global variable 'bucket', so we create a loop
    -- that checks if 'bucket' is not nil:
    while bucket ~= nil do
        local output = mangle(bucket) -- Do some stuff to the content
        coroutine.yield(output) -- Return our new content to the filter chain
    end

    -- Once the buckets are gone, 'bucket' is set to nil, which will exit the 
    -- loop and land us here. Anything extra we want to append to the content
    -- can be done by doing a final yield here. Both input and output filters 
    -- can append data to the content in this phase.
    coroutine.yield([optional footer to be appended to the content])
end
于 2014-11-30T18:34:07.197 回答