It is now possible to write some filter callback functions in lua. All filter callbacks are not supported yet but the mechanism to call them is now in place. Following method may be defined in the Lua filter class to be bound on filter callbacks: * Filter:start_analyse(txn, chn) * Filter:end_analyse(txn, chn) * Filter:tcp_payload(txn, chn, offset, length) hlua_filter_callback() function is responsible to call the good lua function depending on the filter callback function. Using some flags it is possible to allow a lua call to yield or not, to retrieve a return value or not, and to specify if a channel or an http message must be passed as second argument. For now, the HTTP part has not been added yet. It is also possible to add extra argument adding them on the stack before the call. 3 new functions are exposed by the global object "filter". The first one, filter.wake_time(ms_delay), to set the wake_time when a Lua callback function yields (if allowed). The two others, filter.register_data_filter(filter, chn) and filter.unregister_data_filter(filter, chn), to enable or disable the data filtering on a channel for a specific lua filter instance. start_analyse() and end_analyse() may return one of the constant filter.CONTINUE, filter.WAIT or filter.ERROR. If nothing is returned, filter.CONTINUE is used as the default value. On its side, tcp_payload() may return the amount of data to forward. If nothing is returned, all incoming data are forwarded. For now, these functions are not allowed to yield because this interferes with the filter workflow. Here is a simple example : MyFilter = {} MyFilter.id = "My Lua filter" MyFilter.flags = filter.FLT_CFG_FL_HTX MyFilter.__index = MyFilter function MyFilter:new() flt = {} setmetatable(flt, MyFilter) flt.req_len = 0 flt.res_len = 0 return flt end function MyFilter:start_analyze(txn, chn) filter.register_data_filter(self, chn) end function MyFilter:end_analyze(txn, chn) print("<Total> request: "..self.req_len.." - response: "..self.res_len) end function MyFilter:tcp_payload(txn, chn) offset = chn:ouput() len = chn:input() if chn:is_resp() then self.res_len = self.res_len + len print("<TCP:Response> offset: "..offset.." - length: "..len) else self.req_len = self.req_len + len print("<TCP:Request> offset: "..offset.." - length: "..len) end end
The HAProxy documentation has been split into a number of different files for ease of use. Please refer to the following files depending on what you're looking for : - INSTALL for instructions on how to build and install HAProxy - BRANCHES to understand the project's life cycle and what version to use - LICENSE for the project's license - CONTRIBUTING for the process to follow to submit contributions The more detailed documentation is located into the doc/ directory : - doc/intro.txt for a quick introduction on HAProxy - doc/configuration.txt for the configuration's reference manual - doc/lua.txt for the Lua's reference manual - doc/SPOE.txt for how to use the SPOE engine - doc/network-namespaces.txt for how to use network namespaces under Linux - doc/management.txt for the management guide - doc/regression-testing.txt for how to use the regression testing suite - doc/peers.txt for the peers protocol reference - doc/coding-style.txt for how to adopt HAProxy's coding style - doc/internals for developer-specific documentation (not all up to date)
Description
Languages
Shell
100%