Hi,
I am trying to implement a simple action in Lua that is going to save the http response body to a file on disk. Unfortunately I get "unknown runtime error from [C] method 'dup'"
everytime I try to read from the txn:res
channel/buffer via dup() get() getline()
. I get the error when running the latest version of HAProxy via Docker and also when trying with a pre-packaged version of HAProxy 1.9 in Ubuntu 14.04.
I have pasted my play code below - I would really appreciate any pointers that can help me move forward.
haproxy.cfg
global
maxconn 10000
daemon
lua-load /usr/local/etc/haproxy/hello.lua
defaults
mode http
log stdout format raw local0 info
frontend fe-http
bind :80
http-response lua.save_response_action
default_backend be-default
hello.lua
local function save_response(txn)
core.Debug("save_response start!")
if txn.res:get_in_len() > 0 then
core.Debug(txn.res:get_in_len())
core.Debug(txn.res:dup())
end
core.Debug("save_response complete!")
end
core.register_action("save_response_action", { 'http-res' }, save_response, 0)
log output
$ docker run --rm --name haproxy-lua -p 9090:80 -v /tmp/haproxy-docker/conf:/usr/local/etc/haproxy:ro haproxy -d -- /usr/local/etc/haproxy/haproxy.cfg
[WARNING] 273/101818 (1) : config : missing timeouts for frontend 'fe-http'.
| While not properly invalid, you will certainly encounter various problems
| with such a configuration. To fix this, please ensure that all following
| timeouts are set to a non-zero value: 'client', 'connect', 'server'.
[WARNING] 273/101818 (1) : config : missing timeouts for backend 'be-default'.
| While not properly invalid, you will certainly encounter various problems
| with such a configuration. To fix this, please ensure that all following
| timeouts are set to a non-zero value: 'client', 'connect', 'server'.
Available polling systems :
epoll : pref=300, test result OK
poll : pref=200, test result OK
select : pref=150, test result FAILED
Total: 3 (2 usable), will use epoll.
Available filters :
[SPOE] spoe
[COMP] compression
[CACHE] cache
[TRACE] trace
Using epoll() as the polling mechanism.
[NOTICE] 273/101818 (1) : New worker #1 (6) forked
Proxy fe-http started.
Proxy be-default started.
Connect from 192.168.50.1:60192 to 172.17.0.2:80 (fe-http/HTTP)
00000000:fe-http.accept(0006)=000c from [192.168.50.1:60192] ALPN=<none>
00000000:fe-http.clireq[000c:ffffffff]: GET /index.html HTTP/1.1
00000000:fe-http.clihdr[000c:ffffffff]: host: docker-slave:9090
00000000:fe-http.clihdr[000c:ffffffff]: user-agent: curl/7.58.0
00000000:fe-http.clihdr[000c:ffffffff]: accept: */*
00000000:be-default.srvrep[000c:000d]: HTTP/1.1 200 OK
00000000:be-default.srvhdr[000c:000d]: date: Tue, 01 Oct 2019 10:18:22 GMT
00000000:be-default.srvhdr[000c:000d]: server: Apache
00000000:be-default.srvhdr[000c:000d]: vary: X-B3-TraceId,X-B3-SpanId,X-B3-Sampled
00000000:be-default.srvhdr[000c:000d]: last-modified: Mon, 09 Sep 2019 06:35:39 GMT
00000000:be-default.srvhdr[000c:000d]: etag: "1005-59218ff06e2a7"
00000000:be-default.srvhdr[000c:000d]: accept-ranges: bytes
00000000:be-default.srvhdr[000c:000d]: content-length: 4101
Lua function 'save_response_action': unknown runtime error from [C] method 'dup', /usr/local/etc/haproxy/hello.lua:5 C function line 1.
[debug] 273/101822 (6) : save_response start!
[debug] 273/101822 (6) : 4328
[ALERT] 273/101822 (6) : Lua function 'save_response_action': unknown runtime error from [C] method 'dup', /usr/local/etc/haproxy/hello.lua:5 C function line 1.
00000000:be-default.srvcls[000c:000d]
00000000:be-default.clicls[000c:000d]
00000000:be-default.closed[000c:000d]
Connect from 192.168.50.1:60192 to 172.17.0.2:80 (fe-http/HTTP)
00000001:fe-http.accept(0006)=000c from [192.168.50.1:60192] ALPN=<none>
00000001:fe-http.clicls[000c:ffffffff]
00000001:fe-http.closed[000c:ffffffff]
^C[WARNING] 273/101825 (1) : Exiting Master process...
[ALERT] 273/101825 (1) : Current worker #1 (6) exited with code 130 (Interrupt)
[WARNING] 273/101825 (1) : All workers exited. Exiting... (130)
/Andreas