#define APPCTX_FL_SHUTDOWN 0x00000100 /* applet was shut down (->release() called if any). No more data exchange with SCs */
#define APPCTX_FL_WANT_DIE 0x00000200 /* applet was running and requested to die */
#define APPCTX_FL_INOUT_BUFS 0x00000400 /* applet uses its own buffers */
+#define APPCTX_FL_FASTFWD 0x00000800 /* zero-copy forwarding is in-use, don't fill the outbuf */
struct appctx;
struct proxy;
goto end;
}
+ if (flags & CO_RFL_BUF_FLUSH)
+ applet_fl_set(appctx, APPCTX_FL_FASTFWD);
+
ret = appctx->applet->rcv_buf(appctx, buf, count, flags);
if (ret)
applet_fl_clr(appctx, APPCTX_FL_OUTBLK_FULL);
TRACE_ENTER(APPLET_EV_RECV, appctx);
+ applet_fl_set(appctx, APPCTX_FL_FASTFWD);
+
/* TODO: outbuf must be empty. Find a better way to handle that but for now just return -1 */
if (b_data(&appctx->outbuf)) {
TRACE_STATE("Output buffer not empty, cannot fast-forward data", APPLET_EV_RECV, appctx);
len = se_nego_ff(sdo, &BUF_NULL, count, nego_flags);
if (sdo->iobuf.flags & IOBUF_FL_NO_FF) {
sc_ep_clr(sc, SE_FL_MAY_FASTFWD);
+ applet_fl_clr(appctx, APPCTX_FL_FASTFWD);
TRACE_DEVEL("Fast-forwarding not supported by opposite endpoint, disable it", APPLET_EV_RECV, appctx);
goto end;
}
if (!appctx->to_forward) {
se_fl_clr(appctx->sedesc, SE_FL_MAY_FASTFWD);
+ applet_fl_clr(appctx, APPCTX_FL_FASTFWD);
if (ctx->sent == first->len - sizeof(*cache_ptr)) {
applet_set_eoi(appctx);
applet_set_eos(appctx);
if (applet_fl_test(appctx, APPCTX_FL_OUTBLK_ALLOC|APPCTX_FL_OUTBLK_FULL))
goto exit;
- if (se_fl_test(appctx->sedesc, SE_FL_MAY_FASTFWD))
+ if (applet_fl_test(appctx, APPCTX_FL_FASTFWD) && se_fl_test(appctx->sedesc, SE_FL_MAY_FASTFWD))
goto exit;
if (!appctx_get_buf(appctx, &appctx->outbuf)) {
res_htx->flags |= HTX_FL_EOM;
applet_set_eoi(appctx);
se_fl_clr(appctx->sedesc, SE_FL_MAY_FASTFWD);
+ applet_fl_clr(appctx, APPCTX_FL_FASTFWD);
appctx->st0 = HTX_CACHE_END;
}
ret = b_data(buf);
if (stats_dump_stat_to_buffer(sc, buf, NULL)) {
se_fl_clr(appctx->sedesc, SE_FL_MAY_FASTFWD);
+ applet_fl_clr(appctx, APPCTX_FL_FASTFWD);
appctx->st0 = STAT_HTTP_DONE;
}
if (applet_fl_test(appctx, APPCTX_FL_OUTBLK_ALLOC|APPCTX_FL_OUTBLK_FULL))
goto out;
- if (se_fl_test(appctx->sedesc, SE_FL_MAY_FASTFWD))
+ if (applet_fl_test(appctx, APPCTX_FL_FASTFWD) && se_fl_test(appctx->sedesc, SE_FL_MAY_FASTFWD))
goto out;
if (!appctx_get_buf(appctx, &appctx->outbuf)) {
res_htx->flags |= HTX_FL_EOM;
applet_set_eoi(appctx);
se_fl_clr(appctx->sedesc, SE_FL_MAY_FASTFWD);
+ applet_fl_clr(appctx, APPCTX_FL_FASTFWD);
appctx->st0 = STAT_HTTP_END;
}