MINOR: httpclient/lua: supports headers via named arguments
Migrate the httpclient:get() method to named arguments so we can specify optional arguments. This allows to pass headers as an optional argument as an array. The () in the method call must be replaced by {}: local res = httpclient:get{url="http://127.0.0.1:9000/?s=99", headers= {["X-foo"] = { "salt" }, ["X-bar"] = {"pepper" }}}
This commit is contained in:
parent
ef574b2101
commit
746e6f3f8e
|
@ -21,7 +21,7 @@ local function cron()
|
||||||
core.Debug('CRON port:' .. vtc_port)
|
core.Debug('CRON port:' .. vtc_port)
|
||||||
|
|
||||||
local httpclient = core.httpclient()
|
local httpclient = core.httpclient()
|
||||||
local response = httpclient:get("http://127.0.0.1:" .. vtc_port)
|
local response = httpclient:get{url="http://127.0.0.1:" .. vtc_port}
|
||||||
|
|
||||||
core.Info("Received: " .. response.body)
|
core.Info("Received: " .. response.body)
|
||||||
end
|
end
|
||||||
|
|
112
src/hlua.c
112
src/hlua.c
|
@ -7079,6 +7079,77 @@ __LJMP static int hlua_httpclient_get_yield(lua_State *L, int status, lua_KConte
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Allocate and return an array of http_hdr ist extracted from the <headers> lua table
|
||||||
|
*
|
||||||
|
* Caller must free the result
|
||||||
|
*/
|
||||||
|
struct http_hdr *hlua_httpclient_table_to_hdrs(lua_State *L)
|
||||||
|
{
|
||||||
|
struct http_hdr hdrs[global.tune.max_http_hdr];
|
||||||
|
struct http_hdr *result = NULL;
|
||||||
|
uint32_t hdr_num = 0;
|
||||||
|
|
||||||
|
lua_pushnil(L);
|
||||||
|
while (lua_next(L, -2) != 0) {
|
||||||
|
struct ist name, value;
|
||||||
|
const char *n, *v;
|
||||||
|
size_t nlen, vlen;
|
||||||
|
|
||||||
|
if (!lua_isstring(L, -2) || !lua_istable(L, -1)) {
|
||||||
|
/* Skip element if the key is not a string or if the value is not a table */
|
||||||
|
goto next_hdr;
|
||||||
|
}
|
||||||
|
|
||||||
|
n = lua_tolstring(L, -2, &nlen);
|
||||||
|
name = ist2(n, nlen);
|
||||||
|
|
||||||
|
/* Loop on header's values */
|
||||||
|
lua_pushnil(L);
|
||||||
|
while (lua_next(L, -2)) {
|
||||||
|
if (!lua_isstring(L, -1)) {
|
||||||
|
/* Skip the value if it is not a string */
|
||||||
|
goto next_value;
|
||||||
|
}
|
||||||
|
|
||||||
|
v = lua_tolstring(L, -1, &vlen);
|
||||||
|
value = ist2(v, vlen);
|
||||||
|
name = ist2(n, nlen);
|
||||||
|
|
||||||
|
hdrs[hdr_num].n = istdup(name);
|
||||||
|
hdrs[hdr_num].v = istdup(value);
|
||||||
|
|
||||||
|
hdr_num++;
|
||||||
|
|
||||||
|
next_value:
|
||||||
|
lua_pop(L, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
next_hdr:
|
||||||
|
lua_pop(L, 1);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hdr_num) {
|
||||||
|
/* alloc and copy the headers in the httpclient struct */
|
||||||
|
result = calloc((hdr_num + 1), sizeof(*hdrs));
|
||||||
|
if (!result)
|
||||||
|
goto skip_headers;
|
||||||
|
memcpy(result, hdrs, sizeof(struct http_hdr) * (hdr_num + 1));
|
||||||
|
|
||||||
|
result[hdr_num].n = IST_NULL;
|
||||||
|
result[hdr_num].v = IST_NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
skip_headers:
|
||||||
|
lua_pop(L, 1);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Sends and receive an HTTP request
|
* Sends and receive an HTTP request
|
||||||
*
|
*
|
||||||
|
@ -7088,8 +7159,11 @@ __LJMP static int hlua_httpclient_get_yield(lua_State *L, int status, lua_KConte
|
||||||
__LJMP static int hlua_httpclient_get(lua_State *L)
|
__LJMP static int hlua_httpclient_get(lua_State *L)
|
||||||
{
|
{
|
||||||
struct hlua_httpclient *hlua_hc;
|
struct hlua_httpclient *hlua_hc;
|
||||||
|
struct http_hdr *hdrs = NULL;
|
||||||
|
struct http_hdr *hdrs_i = NULL;
|
||||||
struct hlua *hlua;
|
struct hlua *hlua;
|
||||||
const char *url_str;
|
const char *url_str = NULL;
|
||||||
|
int ret;
|
||||||
|
|
||||||
hlua = hlua_gethlua(L);
|
hlua = hlua_gethlua(L);
|
||||||
|
|
||||||
|
@ -7097,14 +7171,25 @@ __LJMP static int hlua_httpclient_get(lua_State *L)
|
||||||
WILL_LJMP(luaL_error(L, "The 'get' function is only allowed in "
|
WILL_LJMP(luaL_error(L, "The 'get' function is only allowed in "
|
||||||
"'frontend', 'backend' or 'task'"));
|
"'frontend', 'backend' or 'task'"));
|
||||||
|
|
||||||
if (lua_gettop(L) < 1 || lua_gettop(L) > 2)
|
if (lua_gettop(L) != 2 || lua_type(L, -1) != LUA_TTABLE)
|
||||||
WILL_LJMP(luaL_error(L, "'get' needs between 1 or 2 arguments"));
|
WILL_LJMP(luaL_error(L, "'get' needs a table as argument"));
|
||||||
|
|
||||||
if (lua_type(L, -1) != LUA_TSTRING)
|
ret = lua_getfield(L, -1, "url");
|
||||||
WILL_LJMP(luaL_error(L, "'get' takes an URL as a string arugment"));
|
if (ret == LUA_TSTRING) {
|
||||||
|
url_str = lua_tostring(L, -1);
|
||||||
|
}
|
||||||
|
lua_pop(L, 1);
|
||||||
|
|
||||||
/* arg 1: URL */
|
ret = lua_getfield(L, -1, "headers");
|
||||||
url_str = lua_tostring(L, -1);
|
if (ret == LUA_TTABLE) {
|
||||||
|
hdrs = hlua_httpclient_table_to_hdrs(L);
|
||||||
|
}
|
||||||
|
lua_pop(L, 1);
|
||||||
|
|
||||||
|
if (!url_str) {
|
||||||
|
WILL_LJMP(luaL_error(L, "'get' need a 'url' argument"));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
hlua_hc = hlua_checkhttpclient(L, 1);
|
hlua_hc = hlua_checkhttpclient(L, 1);
|
||||||
|
|
||||||
|
@ -7118,9 +7203,20 @@ __LJMP static int hlua_httpclient_get(lua_State *L)
|
||||||
hlua_hc->hc->ops.res_end = hlua_httpclient_res_cb;
|
hlua_hc->hc->ops.res_end = hlua_httpclient_res_cb;
|
||||||
|
|
||||||
|
|
||||||
httpclient_req_gen(hlua_hc->hc, hlua_hc->hc->req.url, HTTP_METH_GET, NULL);
|
httpclient_req_gen(hlua_hc->hc, hlua_hc->hc->req.url, HTTP_METH_GET, hdrs);
|
||||||
httpclient_start(hlua_hc->hc);
|
httpclient_start(hlua_hc->hc);
|
||||||
|
|
||||||
|
/* free the temporary headers array */
|
||||||
|
hdrs_i = hdrs;
|
||||||
|
while (hdrs_i && isttest(hdrs_i->n)) {
|
||||||
|
istfree(&hdrs_i->n);
|
||||||
|
istfree(&hdrs_i->v);
|
||||||
|
hdrs_i++;
|
||||||
|
}
|
||||||
|
ha_free(&hdrs);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* we return a "res" object */
|
/* we return a "res" object */
|
||||||
lua_newtable(L);
|
lua_newtable(L);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue