void http_reply_and_close(struct stream *s, short status, const struct buffer *msg);
void http_return_srv_error(struct stream *s, struct stream_interface *si);
struct buffer *http_error_message(struct stream *s);
+int http_forward_proxy_resp(struct stream *s, int final);
struct http_txn *http_alloc_txn(struct stream *s);
void http_init_txn(struct stream *s);
DBG_TRACE_LEAVE(STRM_EV_HTTP_ANA, s, txn);
}
+/* Forward a response generated by HAProxy (error/redirect/return). This
+ * function forwards all pending incoming data. If <final> is set to 0, nothing
+ * more is performed. It is used for 1xx informational messages. Otherwise, the
+ * transaction is terminated and the request is emptied. On success 1 is
+ * returned. If an error occurred, 0 is returned.
+ */
+int http_forward_proxy_resp(struct stream *s, int final)
+{
+ struct channel *req = &s->req;
+ struct channel *res = &s->res;
+ struct htx *htx = htxbuf(&res->buf);
+ size_t data;
+
+ if (final) {
+ htx->flags |= HTX_FL_PROXY_RESP;
+
+ channel_auto_read(req);
+ channel_abort(req);
+ channel_auto_close(req);
+ channel_htx_erase(req, htxbuf(&req->buf));
+
+ res->wex = tick_add_ifset(now_ms, res->wto);
+ channel_auto_read(res);
+ channel_auto_close(res);
+ channel_shutr_now(res);
+ }
+
+ data = htx->data - co_data(res);
+ c_adv(res, data);
+ htx->first = -1;
+ res->total += data;
+ return 1;
+}
+
void http_server_error(struct stream *s, struct stream_interface *si, int err,
int finst, const struct buffer *msg)
{