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
    > 
    > 
    
    

Reply via email to