int status, const struct chunk *msg)
{
t->srv_state = SV_STCLOSE;
+ buffer_shutw_done(t->req);
+ buffer_shutr_done(t->rep);
if (status > 0 && msg) {
t->txn.status = status;
if (t->fe->mode == PR_MODE_HTTP)
*/
if (unlikely(req->flags & (BF_READ_ERROR | BF_READ_NULL))) {
t->inspect_exp = TICK_ETERNITY;
- buffer_shutr(req);
+ buffer_shutr_done(req);
+ buffer_shutw_done(rep);
fd_delete(t->cli_fd);
t->cli_state = CL_STCLOSE;
t->fe->failed_req++;
/* Abort if client read timeout has expired */
else if (unlikely(tick_is_expired(req->rex, now_ms))) {
t->inspect_exp = TICK_ETERNITY;
- buffer_shutr(req);
+ buffer_shutr_done(req);
+ buffer_shutw_done(rep);
fd_delete(t->cli_fd);
t->cli_state = CL_STCLOSE;
t->fe->failed_req++;
if (ret) {
/* we have a matching rule. */
if (rule->action == TCP_ACT_REJECT) {
- buffer_shutr(req);
+ buffer_shutr_done(req);
+ buffer_shutw_done(rep);
fd_delete(t->cli_fd);
t->cli_state = CL_STCLOSE;
t->fe->failed_req++;
/* 2: have we encountered a read error or a close ? */
else if (unlikely(req->flags & (BF_READ_ERROR | BF_READ_NULL))) {
/* read error, or last read : give up. */
- buffer_shutr(req);
+ buffer_shutr_done(req);
+ buffer_shutw_done(rep);
fd_delete(t->cli_fd);
t->cli_state = CL_STCLOSE;
t->fe->failed_req++;
*/
/* read or write error */
if (rep->flags & BF_WRITE_ERROR || req->flags & BF_READ_ERROR) {
- buffer_shutr(req);
- buffer_shutw(rep);
+ buffer_shutr_done(req);
+ buffer_shutw_done(rep);
fd_delete(t->cli_fd);
t->cli_state = CL_STCLOSE;
if (!(t->flags & SN_ERR_MASK))
/* last server read and buffer empty */
else if ((s == SV_STSHUTR || s == SV_STCLOSE) && (rep->l == 0)) {
EV_FD_CLR(t->cli_fd, DIR_WR);
- buffer_shutw(rep);
+ buffer_shutw_done(rep);
shutdown(t->cli_fd, SHUT_WR);
/* We must ensure that the read part is still alive when switching
* to shutw */
/* write timeout */
else if (tick_is_expired(rep->wex, now_ms)) {
EV_FD_CLR(t->cli_fd, DIR_WR);
- buffer_shutw(rep);
+ buffer_shutw_done(rep);
shutdown(t->cli_fd, SHUT_WR);
/* We must ensure that the read part is still alive when switching
* to shutw */
}
else if (c == CL_STSHUTR) {
if (rep->flags & BF_WRITE_ERROR) {
- buffer_shutw(rep);
+ buffer_shutw_done(rep);
fd_delete(t->cli_fd);
t->cli_state = CL_STCLOSE;
if (!(t->flags & SN_ERR_MASK))
}
else if ((s == SV_STSHUTR || s == SV_STCLOSE) && (rep->l == 0)
&& !(t->flags & SN_SELF_GEN)) {
- buffer_shutw(rep);
+ buffer_shutw_done(rep);
fd_delete(t->cli_fd);
t->cli_state = CL_STCLOSE;
return 1;
}
else if (tick_is_expired(rep->wex, now_ms)) {
- buffer_shutw(rep);
+ buffer_shutw_done(rep);
fd_delete(t->cli_fd);
t->cli_state = CL_STCLOSE;
if (!(t->flags & SN_ERR_MASK))
if (t->flags & SN_SELF_GEN) {
produce_content(t);
if (rep->l == 0) {
- buffer_shutw(rep);
+ buffer_shutw_done(rep);
fd_delete(t->cli_fd);
t->cli_state = CL_STCLOSE;
return 1;
}
else if (c == CL_STSHUTW) {
if (req->flags & BF_READ_ERROR) {
- buffer_shutr(req);
+ buffer_shutr_done(req);
fd_delete(t->cli_fd);
t->cli_state = CL_STCLOSE;
if (!(t->flags & SN_ERR_MASK))
return 1;
}
else if (req->flags & BF_READ_NULL || s == SV_STSHUTW || s == SV_STCLOSE) {
- buffer_shutr(req);
+ buffer_shutr_done(req);
fd_delete(t->cli_fd);
t->cli_state = CL_STCLOSE;
return 1;
}
else if (tick_is_expired(req->rex, now_ms)) {
- buffer_shutr(req);
+ buffer_shutr_done(req);
fd_delete(t->cli_fd);
t->cli_state = CL_STCLOSE;
if (!(t->flags & SN_ERR_MASK))
if (unlikely((msg->msg_state == HTTP_MSG_ERROR) ||
(req->flags & BF_WRITE_ERROR) ||
(rep->flags & BF_READ_ERROR))) {
- buffer_shutr(rep);
- buffer_shutw(req);
+ buffer_shutr_done(rep);
+ buffer_shutw_done(req);
fd_delete(t->srv_fd);
if (t->srv) {
t->srv->cur_sess--;
c == CL_STSHUTW || c == CL_STCLOSE ||
rep->l >= rep->rlim - rep->data)) {
EV_FD_CLR(t->srv_fd, DIR_RD);
- buffer_shutr(rep);
+ buffer_shutr_done(rep);
t->srv_state = SV_STSHUTR;
//fprintf(stderr,"%p:%s(%d), c=%d, s=%d\n", t, __FUNCTION__, __LINE__, t->cli_state, t->cli_state);
return 1;
/* read timeout : return a 504 to the client. */
else if (unlikely(EV_FD_ISSET(t->srv_fd, DIR_RD) &&
tick_is_expired(rep->rex, now_ms))) {
- buffer_shutr(rep);
- buffer_shutw(req);
+ buffer_shutr_done(rep);
+ buffer_shutw_done(req);
fd_delete(t->srv_fd);
if (t->srv) {
t->srv->cur_sess--;
* The side-effect is that if the client completely closes its
* connection during SV_STHEADER, the connection to the server
* is kept until a response comes back or the timeout is reached.
+ * FIXME!!! this code can never be called because the condition is
+ * caught earlier (CL_STCLOSE).
*/
else if (unlikely((/*c == CL_STSHUTR ||*/ c == CL_STCLOSE) &&
(req->l == 0))) {
EV_FD_CLR(t->srv_fd, DIR_WR);
- buffer_shutw(req);
+ buffer_shutw_done(req);
/* We must ensure that the read part is still
* alive when switching to shutw */
else if (unlikely(EV_FD_ISSET(t->srv_fd, DIR_WR) &&
tick_is_expired(req->wex, now_ms))) {
EV_FD_CLR(t->srv_fd, DIR_WR);
- buffer_shutw(req);
+ buffer_shutw_done(req);
shutdown(t->srv_fd, SHUT_WR);
/* We must ensure that the read part is still alive
* when switching to shutw */
}
cur_proxy->failed_resp++;
return_srv_prx_502:
- buffer_shutr(rep);
- buffer_shutw(req);
+ buffer_shutr_done(rep);
+ buffer_shutw_done(req);
fd_delete(t->srv_fd);
t->srv_state = SV_STCLOSE;
txn->status = 502;
if ((req->l == 0) &&
(c == CL_STSHUTR || c == CL_STCLOSE || t->be->options & PR_O_FORCE_CLO)) {
EV_FD_CLR(t->srv_fd, DIR_WR);
- buffer_shutw(req);
+ buffer_shutw_done(req);
/* We must ensure that the read part is still alive when switching
* to shutw */
else if (s == SV_STDATA) {
/* read or write error */
if (req->flags & BF_WRITE_ERROR || rep->flags & BF_READ_ERROR) {
- buffer_shutr(rep);
- buffer_shutw(req);
+ buffer_shutr_done(rep);
+ buffer_shutw_done(req);
fd_delete(t->srv_fd);
if (t->srv) {
t->srv->cur_sess--;
/* end of client read and no more data to send */
else if ((c == CL_STSHUTR || c == CL_STCLOSE) && (req->l == 0)) {
EV_FD_CLR(t->srv_fd, DIR_WR);
- buffer_shutw(req);
+ buffer_shutw_done(req);
shutdown(t->srv_fd, SHUT_WR);
/* We must ensure that the read part is still alive when switching
* to shutw */
/* write timeout */
else if (tick_is_expired(req->wex, now_ms)) {
EV_FD_CLR(t->srv_fd, DIR_WR);
- buffer_shutw(req);
+ buffer_shutw_done(req);
shutdown(t->srv_fd, SHUT_WR);
/* We must ensure that the read part is still alive when switching
* to shutw */
else if (s == SV_STSHUTR) {
if (req->flags & BF_WRITE_ERROR) {
//EV_FD_CLR(t->srv_fd, DIR_WR);
- buffer_shutw(req);
+ buffer_shutw_done(req);
fd_delete(t->srv_fd);
if (t->srv) {
t->srv->cur_sess--;
}
else if ((c == CL_STSHUTR || c == CL_STCLOSE) && (req->l == 0)) {
//EV_FD_CLR(t->srv_fd, DIR_WR);
- buffer_shutw(req);
+ buffer_shutw_done(req);
fd_delete(t->srv_fd);
if (t->srv) {
t->srv->cur_sess--;
}
else if (tick_is_expired(req->wex, now_ms)) {
//EV_FD_CLR(t->srv_fd, DIR_WR);
- buffer_shutw(req);
+ buffer_shutw_done(req);
fd_delete(t->srv_fd);
if (t->srv) {
t->srv->cur_sess--;
else if (s == SV_STSHUTW) {
if (rep->flags & BF_READ_ERROR) {
//EV_FD_CLR(t->srv_fd, DIR_RD);
- buffer_shutr(rep);
+ buffer_shutr_done(rep);
fd_delete(t->srv_fd);
if (t->srv) {
t->srv->cur_sess--;
}
else if (rep->flags & BF_READ_NULL || c == CL_STSHUTW || c == CL_STCLOSE) {
//EV_FD_CLR(t->srv_fd, DIR_RD);
- buffer_shutr(rep);
+ buffer_shutr_done(rep);
fd_delete(t->srv_fd);
if (t->srv) {
t->srv->cur_sess--;
}
else if (tick_is_expired(rep->rex, now_ms)) {
//EV_FD_CLR(t->srv_fd, DIR_RD);
- buffer_shutr(rep);
+ buffer_shutr_done(rep);
fd_delete(t->srv_fd);
if (t->srv) {
t->srv->cur_sess--;
*/
/* read or write error */
if (rep->flags & BF_WRITE_ERROR || req->flags & BF_READ_ERROR) {
- buffer_shutr(req);
- buffer_shutw(rep);
+ buffer_shutr_done(req);
+ buffer_shutw_done(rep);
fd_delete(t->cli_fd);
t->cli_state = CL_STCLOSE;
if (!(t->flags & SN_ERR_MASK))
/* last server read and buffer empty */
else if ((s == SV_STSHUTR || s == SV_STCLOSE) && (rep->l == 0)) {
EV_FD_CLR(t->cli_fd, DIR_WR);
- buffer_shutw(rep);
+ buffer_shutw_done(rep);
shutdown(t->cli_fd, SHUT_WR);
/* We must ensure that the read part is still alive when switching
* to shutw */
/* write timeout */
else if (tick_is_expired(rep->wex, now_ms)) {
EV_FD_CLR(t->cli_fd, DIR_WR);
- buffer_shutw(rep);
+ buffer_shutw_done(rep);
shutdown(t->cli_fd, SHUT_WR);
/* We must ensure that the read part is still alive when switching
* to shutw */
}
else if (c == CL_STSHUTR) {
if (rep->flags & BF_WRITE_ERROR) {
- buffer_shutw(rep);
+ buffer_shutw_done(rep);
fd_delete(t->cli_fd);
t->cli_state = CL_STCLOSE;
if (!(t->flags & SN_ERR_MASK))
return 1;
}
else if ((s == SV_STSHUTR || s == SV_STCLOSE) && (rep->l == 0)) {
- buffer_shutw(rep);
+ buffer_shutw_done(rep);
fd_delete(t->cli_fd);
t->cli_state = CL_STCLOSE;
return 1;
}
else if (tick_is_expired(rep->wex, now_ms)) {
- buffer_shutw(rep);
+ buffer_shutw_done(rep);
fd_delete(t->cli_fd);
t->cli_state = CL_STCLOSE;
if (!(t->flags & SN_ERR_MASK))
}
else if (c == CL_STSHUTW) {
if (req->flags & BF_READ_ERROR) {
- buffer_shutr(req);
+ buffer_shutr_done(req);
fd_delete(t->cli_fd);
t->cli_state = CL_STCLOSE;
if (!(t->flags & SN_ERR_MASK))
return 1;
}
else if (req->flags & BF_READ_NULL || s == SV_STSHUTW || s == SV_STCLOSE) {
- buffer_shutr(req);
+ buffer_shutr_done(req);
fd_delete(t->cli_fd);
t->cli_state = CL_STCLOSE;
return 1;
}
else if (tick_is_expired(req->rex, now_ms)) {
- buffer_shutr(req);
+ buffer_shutr_done(req);
fd_delete(t->cli_fd);
t->cli_state = CL_STCLOSE;
if (!(t->flags & SN_ERR_MASK))
else if (s == SV_STDATA) {
/* read or write error */
if (req->flags & BF_WRITE_ERROR || rep->flags & BF_READ_ERROR) {
- buffer_shutr(rep);
- buffer_shutw(req);
+ buffer_shutr_done(rep);
+ buffer_shutw_done(req);
fd_delete(t->srv_fd);
if (t->srv) {
t->srv->cur_sess--;
/* end of client read and no more data to send */
else if ((c == CL_STSHUTR || c == CL_STCLOSE) && (req->l == 0)) {
EV_FD_CLR(t->srv_fd, DIR_WR);
- buffer_shutw(req);
+ buffer_shutw_done(req);
shutdown(t->srv_fd, SHUT_WR);
/* We must ensure that the read part is still alive when switching
* to shutw */
/* write timeout */
else if (tv_isle(&req->wex, &now)) {
EV_FD_CLR(t->srv_fd, DIR_WR);
- buffer_shutw(req);
+ buffer_shutw_done(req);
shutdown(t->srv_fd, SHUT_WR);
/* We must ensure that the read part is still alive when switching
* to shutw */
else if (s == SV_STSHUTR) {
if (req->flags & BF_WRITE_ERROR) {
//EV_FD_CLR(t->srv_fd, DIR_WR);
- buffer_shutw(req);
+ buffer_shutw_done(req);
fd_delete(t->srv_fd);
if (t->srv) {
t->srv->cur_sess--;
}
else if ((c == CL_STSHUTR || c == CL_STCLOSE) && (req->l == 0)) {
//EV_FD_CLR(t->srv_fd, DIR_WR);
- buffer_shutw(req);
+ buffer_shutw_done(req);
fd_delete(t->srv_fd);
if (t->srv)
t->srv->cur_sess--;
}
else if (tv_isle(&req->wex, &now)) {
//EV_FD_CLR(t->srv_fd, DIR_WR);
- buffer_shutw(req);
+ buffer_shutw_done(req);
fd_delete(t->srv_fd);
if (t->srv)
t->srv->cur_sess--;
else if (s == SV_STSHUTW) {
if (rep->flags & BF_READ_ERROR) {
//EV_FD_CLR(t->srv_fd, DIR_RD);
- buffer_shutr(rep);
+ buffer_shutr_done(rep);
fd_delete(t->srv_fd);
if (t->srv) {
t->srv->cur_sess--;
}
else if (rep->flags & BF_READ_NULL || c == CL_STSHUTW || c == CL_STCLOSE) {
//EV_FD_CLR(t->srv_fd, DIR_RD);
- buffer_shutr(rep);
+ buffer_shutr_done(rep);
fd_delete(t->srv_fd);
if (t->srv)
t->srv->cur_sess--;
}
else if (tv_isle(&rep->rex, &now)) {
//EV_FD_CLR(t->srv_fd, DIR_RD);
- buffer_shutr(rep);
+ buffer_shutr_done(rep);
fd_delete(t->srv_fd);
if (t->srv)
t->srv->cur_sess--;