Hi all,

Is it at all feasible to modify a TCP payload via a custom LUA action
in a stable manner? ie, something like this;


function enrich_query(txn)
    --- Duplicate request. :set() will replace the request, if possible
    local req = txn.req:dup()

    -- if error or client closes connection, quit
    if req == nil then return end

    --- Add an identifier for haproxy and include client's IP address.
    if txn.req:set("-Vha1.8," .. txn.f:src() .. " " .. req) == -1 then
        txn.Error(txn, "Failed to enrich query")
    end
end

core.register_action('enrich_query', {'tcp-req'}, enrich_query)


Then called as an action in the frontend;

    # Don't enrich if query already contains client identification
    acl has_client_version req.payload(0,0) -m sub -- -V --client

    # Enrich our query
    tcp-request content lua.enrich_query if !has_client_version
WAIT_END


The reason I ask is that I randomly get yield errors, I assume during
the txn.req:set() ;

Lua function 'enrich_query': yield not allowed.


I have experimented with different values of tune.lua.forced-yield with
little success. Sometimes this occurs very infrequently, other times,
very frequently.

FYI - I have experimented with PROXY, but our backend application is
using a java API that doesn't have native PROXY support (although
there's been a patch pending for about 5 years). Have also experimented
with PROXY and Cloudflare's "mmproxy". That works well, but i've been
asked to use LUA to extend haproxy if possible.


Thanks,
Grant

Reply via email to