struct proxy *be;
struct http_txn *txn;
const struct strm_logs *logs;
- struct connection *be_conn;
+ struct connection *fe_conn, *be_conn;
unsigned int s_flags;
unsigned int uniq_id;
struct buffer chunk;
char *tmplog;
char *ret;
int iret;
+ int status;
struct logformat_node *tmp;
struct timeval tv;
struct strm_logs tmp_strm_log;
be = s->be;
txn = s->txn;
be_conn = cs_conn(objt_cs(s->si[1].end));
+ status = (txn ? txn->status : 0);
s_flags = s->flags;
uniq_id = s->uniq_id;
logs = &s->logs;
*/
be = fe;
txn = NULL;
+ fe_conn = objt_conn(sess->origin);
be_conn = NULL;
+ status = 0;
s_flags = SF_ERR_PRXCOND | SF_FINST_R;
uniq_id = _HA_ATOMIC_XADD(&global.req_count, 1);
tmp_strm_log.srv_queue_pos = 0;
logs = &tmp_strm_log;
+
+ if ((fe->mode == PR_MODE_HTTP) && fe_conn && fe_conn->mux && fe_conn->mux->ctl) {
+ enum mux_exit_status es = fe_conn->mux->ctl(fe_conn, MUX_EXIT_STATUS, NULL);
+
+ switch (es) {
+ case MUX_ES_SUCCESS:
+ break;
+ case MUX_ES_INVALID_ERR:
+ status = 400;
+ if ((fe_conn->flags & CO_FL_ERROR) || conn_xprt_read0_pending(fe_conn))
+ s_flags = SF_ERR_CLICL | SF_FINST_R;
+ else
+ s_flags = SF_ERR_PRXCOND | SF_FINST_R;
+ break;
+ case MUX_ES_TOUT_ERR:
+ status = 408;
+ s_flags = SF_ERR_CLITO | SF_FINST_R;
+ break;
+ case MUX_ES_INTERNAL_ERR:
+ status = 500;
+ s_flags = SF_ERR_INTERNAL | SF_FINST_R;
+ break;
+ default:
+ break;
+ }
+ }
}
t_request = -1;
break;
case LOG_FMT_STATUS: // %ST
- ret = ltoa_o(txn ? txn->status : 0, tmplog, dst + maxsize - tmplog);
+ ret = ltoa_o(status, tmplog, dst + maxsize - tmplog);
if (ret == NULL)
goto out;
tmplog = ret;