diff --git a/include/haproxy/http_htx.h b/include/haproxy/http_htx.h index a02c65c00..f90b4cc74 100644 --- a/include/haproxy/http_htx.h +++ b/include/haproxy/http_htx.h @@ -47,7 +47,7 @@ int http_replace_req_meth(struct htx *htx, const struct ist meth); int http_replace_req_uri(struct htx *htx, const struct ist uri); int http_replace_req_path(struct htx *htx, const struct ist path, int with_qs); int http_replace_req_query(struct htx *htx, const struct ist query); -int http_replace_res_status(struct htx *htx, const struct ist status); +int http_replace_res_status(struct htx *htx, const struct ist status, const struct ist reason); int http_replace_res_reason(struct htx *htx, const struct ist reason); int http_replace_header_value(struct htx *htx, struct http_hdr_ctx *ctx, const struct ist data); int http_replace_header(struct htx *htx, struct http_hdr_ctx *ctx, const struct ist name, const struct ist value); diff --git a/src/http_ana.c b/src/http_ana.c index 73b6e7618..bce84b9ee 100644 --- a/src/http_ana.c +++ b/src/http_ana.c @@ -2815,9 +2815,7 @@ int http_res_set_status(unsigned int status, struct ist reason, struct stream *s reason = ist2(str, strlen(str)); } - if (!http_replace_res_status(htx, ist2(trash.area, trash.data))) - return -1; - if (!http_replace_res_reason(htx, reason)) + if (!http_replace_res_status(htx, ist2(trash.area, trash.data), reason)) return -1; return 0; } diff --git a/src/http_htx.c b/src/http_htx.c index c572697be..de65a4dd0 100644 --- a/src/http_htx.c +++ b/src/http_htx.c @@ -487,11 +487,11 @@ int http_replace_req_query(struct htx *htx, const struct ist query) /* Replace the response status in the HTX message by . It returns * 1 on success, otherwise 0. */ -int http_replace_res_status(struct htx *htx, const struct ist status) +int http_replace_res_status(struct htx *htx, const struct ist status, const struct ist reason) { struct buffer *temp = get_trash_chunk(); struct htx_sl *sl = http_get_stline(htx); - struct ist vsn, reason; + struct ist vsn, r; if (!sl) return 0; @@ -499,13 +499,15 @@ int http_replace_res_status(struct htx *htx, const struct ist status) /* Start by copying old uri and version */ chunk_memcat(temp, HTX_SL_RES_VPTR(sl), HTX_SL_RES_VLEN(sl)); /* vsn */ vsn = ist2(temp->area, HTX_SL_RES_VLEN(sl)); - - chunk_memcat(temp, HTX_SL_RES_RPTR(sl), HTX_SL_RES_RLEN(sl)); /* reason */ - reason = ist2(temp->area + vsn.len, HTX_SL_RES_RLEN(sl)); + r = reason; + if (!isttest(r)) { + chunk_memcat(temp, HTX_SL_RES_RPTR(sl), HTX_SL_RES_RLEN(sl)); /* reason */ + r = ist2(temp->area + vsn.len, HTX_SL_RES_RLEN(sl)); + } /* create the new start line */ sl->info.res.status = strl2ui(status.ptr, status.len); - return http_replace_stline(htx, vsn, status, reason); + return http_replace_stline(htx, vsn, status, r); } /* Replace the response reason in the HTX message by . It returns