Hi Thierry, Thank you for this detailed steps, I'll give it a try.
Best regards Laurent On 21/02/2019 23:40, "Thierry Fournier" <[email protected]> wrote: Hi, You can use something like that: --> receive request from client --> frontend a --> use-service lua.xxx --> [forward data using core.tcp(127.0.0.1:3333) --> frontend (bind 127.0.0.1:3333) --> [send request to your server] --> [receive response] --> [read response in lua.xxx] --> [modify reponse in lua.xxx] --> [forward response ] --> frontend a --> send reponse to client It is a little bit ugly, and it eat manny memory and performances, but it works ! BR, Thierry > On 13 Feb 2019, at 11:18, Laurent Penot <[email protected]> wrote: > > Hi Christopher, > > I'm so sad > It was really working well in my use case with 1.8 versions. > Thank's a lot for your answer > > Best > Laurent > > > > On 13/02/2019 10:56, "Christopher Faulet" <[email protected]> wrote: > > Le 13/02/2019 à 09:34, Laurent Penot a écrit : >> Hi Thierry, guys, >> >> When receiving a POST request on haproxy, I use lua to compute some >> values, and modify the body of the request before forwarding to the >> backend, so my backend can get these variables from the POST and use them. >> >> Here is a sample cfg, and lua code to reproduce this. >> >> ##### Conf (I removed all defauts, timeout and co ..) : >> >> frontend front-nodes >> >> bind :80 >> >> # option to wait for the body before processing (mandatory for POST >> requests) >> >> option http-buffer-request >> >> # default backend >> >> default_backend be_test >> >> http-request lua.manageRequests >> >> ##### Lua : >> >> *function */manageRequests/(txn) >> >> -- create new postdata >> >> *local *newPostData = /core/./concat/() >> >> newPostData:add('POST /test.php HTTP/1.1\r\n') >> >> newPostData:add('Host: test1\r\n') >> >> newPostData:add('content-type: application/x-www-form-urlencoded\r\n') >> >> *local *newBodyStr = 'var1=valueA&var2=valueB' >> >> *local *newBodyLen = string.len(newBodyStr) >> >> newPostData:add('content-length: ' .. tostring(newBodyLen) .. '\r\n') >> >> newPostData:add('\r\n') >> >> newPostData:add(newBodyStr) >> >> *local *newPostDataStr = tostring(newPostData:dump()) >> >> txn.req:send(newPostDataStr) >> >> *end* >> >> /core/./register_action/("manageRequests", { "http-req" }, /manageRequests/) >> >> This is working well in haproxy 1.8.x (x : 14 to 18) but I get the >> following error with 1.9.4 (same error with 1.9.2, others 1.9.x versions >> not tested) : >> >> Lua function 'manageRequests': runtime error: 0 from [C] method 'send', >> /etc/haproxy/lua/bench.lua:97 C function line 80. >> >> Line 97 of my lua file is txn.req:send(newPostDataStr) >> >> Maybe I’m missing something on 1.9.x but cant find what, or maybe it’s a >> bug, I can’t say. >> > Hi Laurent, > > It is not supported to modify an HTTP request/response calling Channel > functions. It means calling following functions within an HTTP proxy is > forbidden: Channel.get, Channel.dup, Channel.getline, Channel.set, > Channel.append, Channel.send, Channel.forward. > > Since HAProxy 1.9, a runtime error is triggered (because there is no way > to do it during the configuration parsing, AFAIK). You may see this as a > regression, but in fact, it was never really supported. But because of a > lack check, no error was triggered. Because these functions totally > hijacked the HTTP parser, if used, the result is undefined. There are > many ways to crash HAProxy. Unfortunately, for now, there is no way to > rewrite the HTTP messages in Lua. > > -- > Christopher Faulet > >

