When data are transferred to or from the htt-pclient, the applet is
systematically woken up, even when no data are transferred. This could lead
to needlessly wakeups. When called from a lua script, if data are blocked
for a while, this leads to a wakeup ping-pong loop where the http-client
applet is woken up by the lua script which wakes back the script.
To fix the issue, in httpclient_req_xfer() and httpclient_res_xfer()
functions, we now take care to not wake the http-client applet up when no
data are transferred.
This patch must be backported as far as 2.6.
int ret;
ret = b_force_xfer(dst, &hc->res.buf, MIN(room, b_data(&hc->res.buf)));
+
/* call the client once we consumed all data */
if (!b_data(&hc->res.buf)) {
b_free(&hc->res.buf);
- if (hc->appctx)
+ if (ret && hc->appctx)
appctx_wakeup(hc->appctx);
}
return ret;
if (!htx)
goto error;
- if (hc->appctx)
- appctx_wakeup(hc->appctx);
-
ret += htx_add_data(htx, src);
+ if (ret && hc->appctx)
+ appctx_wakeup(hc->appctx);
/* if we copied all the data and the end flag is set */
if ((istlen(src) == ret) && end) {