From 841475e304c0c85ab56b8cc0a10b18305c494a68 Mon Sep 17 00:00:00 2001 From: Thierry FOURNIER Date: Fri, 11 Dec 2015 17:10:09 +0100 Subject: [PATCH] MINOR: lua: service/applet can have access to the HTTP headers when a POST is received When a POST is processed by a Lua service, the HTTP header are potentially gone. So, we cannot retrieve their content using the standard "hdr" sample fetchs (which will soon become invalid anyway) from an applet. This patch add an entry "headers" to the object applet_http. This entry is an array containing all the headers. It permits to use the HTTP headers during the processing of the service. Many thanks to Jan Bruder for reporting this issue with enough details to reproduce it. This patch will have to be backported to 1.6 since it will be the only way to access headers from Lua applets. --- doc/lua-api/index.rst | 4 ++++ src/hlua.c | 12 ++++++++++++ 2 files changed, 16 insertions(+) diff --git a/doc/lua-api/index.rst b/doc/lua-api/index.rst index 60c972507..9972c4920 100644 --- a/doc/lua-api/index.rst +++ b/doc/lua-api/index.rst @@ -1369,6 +1369,10 @@ AppletHTTP class end) +.. js:attribute:: AppletHTTP.headers + + Contains an array containing all the request headers. + .. js:function:: AppletHTTP.set_status(code) This function sets the HTTP status code for the response. The allowed code are diff --git a/src/hlua.c b/src/hlua.c index 17e9b54e0..a03b9ddd9 100644 --- a/src/hlua.c +++ b/src/hlua.c @@ -3476,6 +3476,7 @@ __LJMP static struct hlua_appctx *hlua_checkapplet_http(lua_State *L, int ud) static int hlua_applet_http_new(lua_State *L, struct appctx *ctx) { struct hlua_appctx *appctx; + struct hlua_txn htxn; struct stream_interface *si = ctx->owner; struct stream *s = si_strm(si); struct proxy *px = s->be; @@ -3534,6 +3535,17 @@ static int hlua_applet_http_new(lua_State *L, struct appctx *ctx) lua_pushlstring(L, txn->req.chn->buf->p + txn->req.sl.rq.v, txn->req.sl.rq.v_l); lua_settable(L, -3); + /* creates an array of headers. hlua_http_get_headers() crates and push + * the array on the top of the stack. + */ + lua_pushstring(L, "headers"); + htxn.s = s; + htxn.p = px; + htxn.dir = SMP_OPT_DIR_REQ; + if (!hlua_http_get_headers(L, &htxn, &htxn.s->txn->req)) + return 0; + lua_settable(L, -3); + /* Get path and qs */ path = http_get_path(txn); end = txn->req.chn->buf->p + txn->req.sl.rq.u + txn->req.sl.rq.u_l;