diff --git a/include/types/channel.h b/include/types/channel.h index 2eea3e81f..88a52a412 100644 --- a/include/types/channel.h +++ b/include/types/channel.h @@ -59,7 +59,7 @@ #define CF_READ_ERROR 0x00000008 /* unrecoverable error on producer side */ #define CF_READ_ACTIVITY (CF_READ_NULL|CF_READ_PARTIAL|CF_READ_ERROR) -/* unused: 0x00000010 */ +#define CF_WAKE_CONNECT 0x00000010 /* wake the task up after connect succeeds */ #define CF_SHUTR 0x00000020 /* producer has already shut down */ #define CF_SHUTR_NOW 0x00000040 /* the producer must shut down for reads ASAP */ #define CF_READ_NOEXP 0x00000080 /* producer should not expire */ diff --git a/src/proto_http.c b/src/proto_http.c index 1953caa10..2febda47d 100644 --- a/src/proto_http.c +++ b/src/proto_http.c @@ -4754,7 +4754,7 @@ void http_end_txn_clean_session(struct session *s) s->req->cons->conn_retries = 0; /* used for logging too */ s->req->cons->exp = TICK_ETERNITY; s->req->cons->flags &= SI_FL_DONT_WAKE; /* we're in the context of process_session */ - s->req->flags &= ~(CF_SHUTW|CF_SHUTW_NOW|CF_AUTO_CONNECT|CF_WRITE_ERROR|CF_STREAMER|CF_STREAMER_FAST|CF_NEVER_WAIT); + s->req->flags &= ~(CF_SHUTW|CF_SHUTW_NOW|CF_AUTO_CONNECT|CF_WRITE_ERROR|CF_STREAMER|CF_STREAMER_FAST|CF_NEVER_WAIT|CF_WAKE_CONNECT); s->rep->flags &= ~(CF_SHUTR|CF_SHUTR_NOW|CF_READ_ATTACHED|CF_READ_ERROR|CF_READ_NOEXP|CF_STREAMER|CF_STREAMER_FAST|CF_WRITE_PARTIAL|CF_NEVER_WAIT); s->flags &= ~(SN_DIRECT|SN_ASSIGNED|SN_ADDR_SET|SN_BE_ASSIGNED|SN_FORCE_PRST|SN_IGNORE_PRST); s->flags &= ~(SN_CURR_SESS|SN_REDIRECTABLE|SN_SRV_REUSED); @@ -5213,6 +5213,7 @@ int http_request_forward_body(struct session *s, struct channel *req, int an_bit if (unlikely(msg->flags & HTTP_MSGF_WAIT_CONN)) { if (!(s->rep->flags & CF_READ_ATTACHED)) { channel_auto_connect(req); + req->flags |= CF_WAKE_CONNECT; goto missing_data; } msg->flags &= ~HTTP_MSGF_WAIT_CONN; diff --git a/src/session.c b/src/session.c index dc72ba52f..08241674f 100644 --- a/src/session.c +++ b/src/session.c @@ -932,6 +932,10 @@ static void sess_establish(struct session *s, struct stream_interface *si) rep->analysers |= s->fe->fe_rsp_ana | s->be->be_rsp_ana; rep->flags |= CF_READ_ATTACHED; /* producer is now attached */ + if (req->flags & CF_WAKE_CONNECT) { + req->flags |= CF_WAKE_ONCE; + req->flags &= ~CF_WAKE_CONNECT; + } if (objt_conn(si->end)) { /* real connections have timeouts */ req->wto = s->be->timeout.server;