diff --git a/src/http_client.c b/src/http_client.c
index a289206eb..fe85f050b 100644
--- a/src/http_client.c
+++ b/src/http_client.c
@@ -569,17 +569,19 @@ static void httpclient_applet_io_handler(struct appctx *appctx)
 		switch(appctx->st0) {
 
 			case HTTPCLIENT_S_REQ:
-				/* copy the request from the hc->req.buf buffer */
-				/* We now that it fits the content of a buffer so can
-				 * just push this entirely */
+				/* we know that the buffer is empty here, since
+				 * it's the first call, we can freely copy the
+				 * request from the httpclient buffer */
 				ret = b_xfer(&req->buf, &hc->req.buf, b_data(&hc->req.buf));
-				if (ret)
-					channel_add_input(req, b_data(&req->buf));
+				if (!ret)
+					goto more;
 
-				htx = htxbuf(&req->buf);
+				htx = htx_from_buf(&req->buf);
 				if (!htx)
 					goto more;
 
+				channel_add_input(req, htx->data);
+
 				if (htx->flags & HTX_FL_EOM) /* check if a body need to be added */
 					appctx->st0 = HTTPCLIENT_S_RES_STLINE;
 				else
@@ -592,15 +594,29 @@ static void httpclient_applet_io_handler(struct appctx *appctx)
 				{
 					if (hc->ops.req_payload) {
 
-						ret = b_xfer(&req->buf, &hc->req.buf, b_data(&hc->req.buf));
-						if (ret)
-							channel_add_input(req, b_data(&req->buf));
-
 						/* call the request callback */
 						hc->ops.req_payload(hc);
+						/* check if the request buffer is empty */
+
+						htx = htx_from_buf(&req->buf);
+						if (!htx_is_empty(htx))
+							goto more;
+						/* Here htx_to_buf() will set buffer data to 0 because
+						 * the HTX is empty, and allow us to do an xfer.
+						 */
+						htx_to_buf(htx, &req->buf);
+
+						ret = b_xfer(&req->buf, &hc->req.buf, b_data(&hc->req.buf));
+						if (!ret)
+							goto more;
+						htx = htx_from_buf(&req->buf);
+						if (!htx)
+							goto more;
+
+						channel_add_input(req, htx->data);
 					}
 
-					htx = htxbuf(&req->buf);
+					htx = htx_from_buf(&req->buf);
 					if (!htx)
 						goto more;