if (!ret)
continue;
}
- if (!http_apply_redirect_rule(rule, s, txn))
+ if (!http_apply_redirect_rule(rule, s, txn)) {
goto return_int_err;
+ }
goto done;
}
* response. Otherwise, let a change to forward the response
* first.
*/
- if (htx_is_empty(htxbuf(&s->res.buf)))
+ if (htx_is_empty(htxbuf(&s->res.buf))) {
+ COUNT_IF(1, "Server abort during request forwarding");
goto return_srv_abort;
+ }
}
http_end_request(s);
missing_data_or_waiting:
/* stop waiting for data if the input is closed before the end */
- if (msg->msg_state < HTTP_MSG_ENDING && (s->scf->flags & (SC_FL_ABRT_DONE|SC_FL_EOS)))
+ if (msg->msg_state < HTTP_MSG_ENDING && (s->scf->flags & (SC_FL_ABRT_DONE|SC_FL_EOS))) {
+ COUNT_IF(1, "Client abort during request forwarding");
goto return_cli_abort;
+ }
waiting:
/* waiting for the last bits to leave the buffer */
/* Handle server aborts only if there is no response. Otherwise,
* let a change to forward the response first.
*/
- if (htx_is_empty(htxbuf(&s->res.buf)))
+ if (htx_is_empty(htxbuf(&s->res.buf))) {
+ COUNT_IF(1, "Server abort during request forwarding");
goto return_srv_abort;
+ }
}
/* When TE: chunked is used, we need to get there again to parse remaining
if (objt_server(s->target))
_HA_ATOMIC_INC(&__objt_server(s->target)->counters.internal_errors);
status = 500;
+ COUNT_IF(1, "Internal error during request forwarding");
goto return_prx_cond;
return_bad_req:
if (sess->listener && sess->listener->counters)
_HA_ATOMIC_INC(&sess->listener->counters->failed_req);
status = 400;
+ COUNT_IF(1, "Request parsing error during request forwarding");
/* fall through */
return_prx_cond:
if ((s->scf->flags & SC_FL_SHUT_DONE) && co_data(res)) {
/* response errors are most likely due to the client aborting
* the transfer. */
+ COUNT_IF(1, "Client abort during response forwarding");
goto return_cli_abort;
}
return 0;
missing_data_or_waiting:
- if (s->scf->flags & SC_FL_SHUT_DONE)
+ if (s->scf->flags & SC_FL_SHUT_DONE) {
+ COUNT_IF(1, "Client abort during response forwarding");
goto return_cli_abort;
+ }
/* stop waiting for data if the input is closed before the end. If the
* client side was already closed, it means that the client has aborted,
*/
if (msg->msg_state < HTTP_MSG_ENDING && (s->scb->flags & (SC_FL_EOS|SC_FL_ABRT_DONE))) {
if ((s->scf->flags & (SC_FL_EOS|SC_FL_ABRT_DONE)) &&
- (s->scb->flags & SC_FL_SHUT_DONE))
+ (s->scb->flags & SC_FL_SHUT_DONE)) {
+ COUNT_IF(1, "Client abort during response forwarding");
goto return_cli_abort;
+ }
/* If we have some pending data, we continue the processing */
- if (htx_is_empty(htx))
+ if (htx_is_empty(htx)) {
+ COUNT_IF(1, "Server abort during response forwarding");
goto return_srv_abort;
+ }
}
/* When TE: chunked is used, we need to get there again to parse
_HA_ATOMIC_INC(&__objt_server(s->target)->counters.internal_errors);
if (!(s->flags & SF_ERR_MASK))
s->flags |= SF_ERR_INTERNAL;
+ COUNT_IF(1, "Internal error during response forwarding");
goto return_error;
return_bad_res:
health_adjust(__objt_server(s->target), HANA_STATUS_HTTP_RSP);
}
stream_inc_http_fail_ctr(s);
+ COUNT_IF(1, "Response parsing error during response forwarding");
/* fall through */
return_error:
sc_abort(scf);
sc_shutdown(scf);
if (!(req->analysers) && !(res->analysers)) {
+ COUNT_IF(1, "Report a client abort (no analysers)");
_HA_ATOMIC_INC(&s->be->be_counters.cli_aborts);
_HA_ATOMIC_INC(&sess->fe->fe_counters.cli_aborts);
if (sess->listener && sess->listener->counters)
if (srv)
_HA_ATOMIC_INC(&srv->counters.failed_resp);
if (!(req->analysers) && !(res->analysers)) {
+ COUNT_IF(1, "Report a client abort (no analysers)");
_HA_ATOMIC_INC(&s->be->be_counters.srv_aborts);
_HA_ATOMIC_INC(&sess->fe->fe_counters.srv_aborts);
if (sess->listener && sess->listener->counters)
if (srv)
_HA_ATOMIC_INC(&srv->counters.cli_aborts);
s->flags |= SF_ERR_CLICL;
+ COUNT_IF(1, "Report unhandled client error");
}
else if (req->flags & CF_READ_TIMEOUT) {
_HA_ATOMIC_INC(&s->be->be_counters.cli_aborts);
if (srv)
_HA_ATOMIC_INC(&srv->counters.cli_aborts);
s->flags |= SF_ERR_CLITO;
+ COUNT_IF(1, "Report unhandled client timeout (RD)");
}
else {
_HA_ATOMIC_INC(&s->be->be_counters.srv_aborts);
if (srv)
_HA_ATOMIC_INC(&srv->counters.srv_aborts);
s->flags |= SF_ERR_SRVTO;
+ COUNT_IF(1, "Report unhandled server timeout (WR)");
}
sess_set_term_flags(s);
if (srv)
_HA_ATOMIC_INC(&srv->counters.srv_aborts);
s->flags |= SF_ERR_SRVCL;
+ COUNT_IF(1, "Report unhandled server error");
}
else if (res->flags & CF_READ_TIMEOUT) {
_HA_ATOMIC_INC(&s->be->be_counters.srv_aborts);
if (srv)
_HA_ATOMIC_INC(&srv->counters.srv_aborts);
s->flags |= SF_ERR_SRVTO;
+ COUNT_IF(1, "Report unhandled server timeout (RD)");
}
else {
_HA_ATOMIC_INC(&s->be->be_counters.cli_aborts);
if (srv)
_HA_ATOMIC_INC(&srv->counters.cli_aborts);
s->flags |= SF_ERR_CLITO;
+ COUNT_IF(1, "Report unhandled client timeout (WR)");
}
sess_set_term_flags(s);
}