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

