From 72c7d8d040f3b476808580ecbae422a1b50b9662 Mon Sep 17 00:00:00 2001 From: Christopher Faulet Date: Mon, 27 Jan 2020 15:32:25 +0100 Subject: [PATCH] MINOR: http-ana: Rely on http_reply_and_close() to handle server error The http_server_error() function now relies on http_reply_and_close(). Both do almost the same actions. In addtion, http_server_error() sets the error flag and the final state flag on the stream. --- include/proto/http_ana.h | 2 +- src/http_ana.c | 37 ++++++------------------------------- 2 files changed, 7 insertions(+), 32 deletions(-) diff --git a/include/proto/http_ana.h b/include/proto/http_ana.h index 6bef553c9e..57fd881b52 100644 --- a/include/proto/http_ana.h +++ b/include/proto/http_ana.h @@ -48,7 +48,7 @@ void http_check_request_for_cacheability(struct stream *s, struct channel *req); void http_check_response_for_cacheability(struct stream *s, struct channel *res); void http_perform_server_redirect(struct stream *s, struct stream_interface *si); void http_server_error(struct stream *s, struct stream_interface *si, int err, int finst, const struct buffer *msg); -void http_reply_and_close(struct stream *s, short status, struct buffer *msg); +void http_reply_and_close(struct stream *s, short status, const struct buffer *msg); void http_return_srv_error(struct stream *s, struct stream_interface *si); struct buffer *http_error_message(struct stream *s); diff --git a/src/http_ana.c b/src/http_ana.c index eb260056da..2ef4b39b33 100644 --- a/src/http_ana.c +++ b/src/http_ana.c @@ -4550,45 +4550,25 @@ static void http_end_response(struct stream *s) void http_server_error(struct stream *s, struct stream_interface *si, int err, int finst, const struct buffer *msg) { - channel_auto_read(si_oc(si)); - channel_abort(si_oc(si)); - channel_auto_close(si_oc(si)); - channel_htx_erase(si_oc(si), htxbuf(&(si_oc(si))->buf)); - channel_htx_truncate(si_ic(si), htxbuf(&(si_ic(si))->buf)); - channel_auto_close(si_ic(si)); - channel_auto_read(si_ic(si)); - - /* is an HTX structure. So we copy it in the response's - * channel */ - if (msg && !b_is_null(msg)) { - struct channel *chn = si_ic(si); - struct htx *htx; - size_t data; - - FLT_STRM_CB(s, flt_http_reply(s, s->txn->status, msg)); - htx = htx_from_buf(&chn->buf); - if (channel_htx_copy_msg(chn, htx, msg)) { - htx->flags |= HTX_FL_PROXY_RESP; - data = htx->data - co_data(chn); - c_adv(chn, data); - htx->first = -1; - chn->total += data; - } - } + http_reply_and_close(s, s->txn->status, msg); if (!(s->flags & SF_ERR_MASK)) s->flags |= err; if (!(s->flags & SF_FINST_MASK)) s->flags |= finst; } -void http_reply_and_close(struct stream *s, short status, struct buffer *msg) +void http_reply_and_close(struct stream *s, short status, const struct buffer *msg) { channel_auto_read(&s->req); channel_abort(&s->req); channel_auto_close(&s->req); channel_htx_erase(&s->req, htxbuf(&s->req.buf)); channel_htx_truncate(&s->res, htxbuf(&s->res.buf)); + channel_auto_read(&s->res); + channel_auto_close(&s->res); + channel_shutr_now(&s->res); + s->res.wex = tick_add_ifset(now_ms, s->res.wto); s->txn->flags &= ~TX_WAIT_NEXT_RQ; /* is an HTX structure. So we copy it in the response's @@ -4608,11 +4588,6 @@ void http_reply_and_close(struct stream *s, short status, struct buffer *msg) chn->total += data; } } - - s->res.wex = tick_add_ifset(now_ms, s->res.wto); - channel_auto_read(&s->res); - channel_auto_close(&s->res); - channel_shutr_now(&s->res); } struct buffer *http_error_message(struct stream *s)