}
case ACT_CUSTOM:
- if ((px->options & PR_O_ABRT_CLOSE) && (s->req.flags & (CF_SHUTR|CF_READ_NULL|CF_READ_ERROR)))
+ if ((s->req.flags & CF_READ_ERROR) ||
+ ((s->req.flags & (CF_SHUTR|CF_READ_NULL)) &&
+ !(s->si[0].flags & SI_FL_CLEAN_ABRT) &&
+ (px->options & PR_O_ABRT_CLOSE)))
act_flags |= ACT_FLAG_FINAL;
switch (rule->action_ptr(rule, px, s->sess, s, act_flags)) {
break;
case ACT_CUSTOM:
- if ((px->options & PR_O_ABRT_CLOSE) && (s->req.flags & (CF_SHUTR|CF_READ_NULL|CF_READ_ERROR)))
+ if ((s->req.flags & CF_READ_ERROR) ||
+ ((s->req.flags & (CF_SHUTR|CF_READ_NULL)) &&
+ !(s->si[0].flags & SI_FL_CLEAN_ABRT) &&
+ (px->options & PR_O_ABRT_CLOSE)))
act_flags |= ACT_FLAG_FINAL;
switch (rule->action_ptr(rule, px, s->sess, s, act_flags)) {
*/
if (((txn->flags & TX_CON_WANT_MSK) != TX_CON_WANT_SCL) &&
((txn->flags & TX_CON_WANT_MSK) != TX_CON_WANT_KAL) &&
- !(s->be->options & PR_O_ABRT_CLOSE) &&
+ (!(s->be->options & PR_O_ABRT_CLOSE) ||
+ (s->si[0].flags & SI_FL_CLEAN_ABRT)) &&
txn->meth != HTTP_METH_POST)
channel_dont_read(chn);
/* see above in MSG_DONE why we only do this in these states */
if (((txn->flags & TX_CON_WANT_MSK) != TX_CON_WANT_SCL) &&
((txn->flags & TX_CON_WANT_MSK) != TX_CON_WANT_KAL) &&
- !(s->be->options & PR_O_ABRT_CLOSE))
+ (!(s->be->options & PR_O_ABRT_CLOSE) ||
+ (s->si[0].flags & SI_FL_CLEAN_ABRT)))
channel_dont_read(chn);
goto wait_other_side;
}
* server, which will decide whether to close or to go on processing the
* request. We only do that in tunnel mode, and not in other modes since
* it can be abused to exhaust source ports. */
- if (s->be->options & PR_O_ABRT_CLOSE) {
+ if ((s->be->options & PR_O_ABRT_CLOSE) && !(s->si[0].flags & SI_FL_CLEAN_ABRT)) {
channel_auto_read(req);
if ((req->flags & (CF_SHUTR|CF_READ_NULL)) &&
((txn->flags & TX_CON_WANT_MSK) != TX_CON_WANT_TUN))
unlikely((rep->flags & CF_SHUTW) ||
((req->flags & CF_SHUTW_NOW) && /* FIXME: this should not prevent a connection from establishing */
((!(req->flags & (CF_WRITE_ACTIVITY|CF_WRITE_EVENT)) && channel_is_empty(req)) ||
- s->be->options & PR_O_ABRT_CLOSE)))) {
+ ((s->be->options & PR_O_ABRT_CLOSE) && !(s->si[0].flags & SI_FL_CLEAN_ABRT)))))) {
/* give up */
si_shutw(si);
si->err_type |= SI_ET_CONN_ABRT;
{
return ((req->flags & (CF_READ_ERROR)) ||
((req->flags & CF_SHUTW_NOW) && /* empty and client aborted */
- (channel_is_empty(req) || s->be->options & PR_O_ABRT_CLOSE)));
+ (channel_is_empty(req) ||
+ ((s->be->options & PR_O_ABRT_CLOSE) && !(s->si[0].flags & SI_FL_CLEAN_ABRT)))));
}
/* Update back stream interface status for input states SI_ST_ASS, SI_ST_QUE,