From: Willy Tarreau Date: Fri, 7 Sep 2018 13:47:35 +0000 (+0200) Subject: MINOR: http: make the HTTP error capture rely on the generic proxy code X-Git-Tag: v1.9-dev2~67 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ef3ca73fc3d60ce1cf450382c2f97d1a46f4efb4;p=thirdparty%2Fhaproxy.git MINOR: http: make the HTTP error capture rely on the generic proxy code Now that we have a generic error capture function, let's simplify http_capture_bad_message() to make use of it. At this point the API is not changed at all, but it could be further simplified. --- diff --git a/src/proto_http.c b/src/proto_http.c index 00be9fe37f..a94fb699c8 100644 --- a/src/proto_http.c +++ b/src/proto_http.c @@ -8035,60 +8035,29 @@ void http_capture_bad_message(struct proxy *proxy, struct error_snapshot *es, st struct http_msg *msg, enum h1_state state, struct proxy *other_end) { - struct session *sess = strm_sess(s); - struct channel *chn = msg->chn; - int len1, len2; - - HA_SPIN_LOCK(PROXY_LOCK, &proxy->lock); - es->buf_len = MIN(ci_data(chn), global.tune.bufsize); - len1 = b_wrap(&chn->buf) - ci_head(chn); - len1 = MIN(len1, es->buf_len); - len2 = es->buf_len - len1; /* remaining data if buffer wraps */ - - if (!es->buf) - es->buf = malloc(global.tune.bufsize); - - if (es->buf) { - memcpy(es->buf, ci_head(chn), len1); - if (len2) - memcpy(es->buf + len1, b_orig(&chn->buf), len2); - } - - if (msg->err_pos >= 0) - es->buf_err = msg->err_pos; - else - es->buf_err = msg->next; - - es->when = date; // user-visible date - es->srv = objt_server(s->target); - es->oe = other_end; - if (objt_conn(sess->origin)) - es->src = __objt_conn(sess->origin)->addr.from; - else - memset(&es->src, 0, sizeof(es->src)); - - es->ev_id = HA_ATOMIC_XADD(&error_snapshot_id, 1); - es->buf_wrap = b_wrap(&chn->buf) - ci_head(chn); - es->buf_out = co_data(chn); - es->buf_ofs = chn->total; - - /* be sure to indicate the offset of the first IN byte */ - if (es->buf_ofs >= es->buf_len) - es->buf_ofs -= es->buf_len; - else - es->buf_ofs = 0; + union error_snapshot_ctx ctx; + long ofs; /* http-specific part now */ - es->show = http_show_error_snapshot; - es->ctx.http.sid = s->uniq_id; - es->ctx.http.state = state; - es->ctx.http.b_flags = chn->flags; - es->ctx.http.s_flags = s->flags; - es->ctx.http.t_flags = s->txn->flags; - es->ctx.http.m_flags = msg->flags; - es->ctx.http.m_clen = msg->chunk_len; - es->ctx.http.m_blen = msg->body_len; - HA_SPIN_UNLOCK(PROXY_LOCK, &proxy->lock); + ctx.http.sid = s->uniq_id; + ctx.http.state = state; + ctx.http.b_flags = msg->chn->flags; + ctx.http.s_flags = s->flags; + ctx.http.t_flags = s->txn->flags; + ctx.http.m_flags = msg->flags; + ctx.http.m_clen = msg->chunk_len; + ctx.http.m_blen = msg->body_len; + + ofs = msg->chn->total - ci_data(msg->chn); + if (ofs < 0) + ofs = 0; + + proxy_capture_error(proxy, es == &proxy->invalid_rep, + other_end, s->target, + strm_sess(s), &msg->chn->buf, + ofs, co_data(msg->chn), + (msg->err_pos >= 0) ? msg->err_pos : msg->next, + &ctx, http_show_error_snapshot); } /* Return in and the pointer and length of occurrence of