From b8ce505c6f0b202ccdb8e512fed0888652ed5b12 Mon Sep 17 00:00:00 2001 From: Christopher Faulet Date: Mon, 31 Aug 2020 16:11:57 +0200 Subject: [PATCH] MINOR: http-htx: Add an option to eval query-string when the path is replaced The http_replace_req_path() function now takes a third argument to evaluate the query-string as part of the path or to preserve it. If is set, the query-string is replaced with the path. Otherwise, only the path is replaced. This patch is mandatory to fix issue #829. The next commit depends on it. So be carefull during backports. --- include/haproxy/http_htx.h | 2 +- src/http_ana.c | 2 +- src/http_htx.c | 16 +++++++++++----- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/include/haproxy/http_htx.h b/include/haproxy/http_htx.h index 4b0f09744..a02c65c00 100644 --- a/include/haproxy/http_htx.h +++ b/include/haproxy/http_htx.h @@ -45,7 +45,7 @@ int http_add_header(struct htx *htx, const struct ist n, const struct ist v); int http_replace_stline(struct htx *htx, const struct ist p1, const struct ist p2, const struct ist p3); 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 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_reason(struct htx *htx, const struct ist reason); diff --git a/src/http_ana.c b/src/http_ana.c index 39f75de23..43c2145bd 100644 --- a/src/http_ana.c +++ b/src/http_ana.c @@ -2771,7 +2771,7 @@ int http_req_replace_stline(int action, const char *replace, int len, break; case 1: // path - if (!http_replace_req_path(htx, ist2(replace, len))) + if (!http_replace_req_path(htx, ist2(replace, len), 0)) return -1; break; diff --git a/src/http_htx.c b/src/http_htx.c index 41211bb8f..c572697be 100644 --- a/src/http_htx.c +++ b/src/http_htx.c @@ -396,10 +396,12 @@ int http_replace_req_uri(struct htx *htx, const struct ist uri) return 0; } -/* Replace the request path in the HTX message by . The host part - * and the query string are preserved. It returns 1 on success, otherwise 0. +/* Replace the request path in the HTX message by . The host part is + * preserverd. if is set, the query string is evaluated as part of the + * path and replaced. Otherwise, it is preserved too. It returns 1 on success, + * otherwise 0. */ -int http_replace_req_path(struct htx *htx, const struct ist path) +int http_replace_req_path(struct htx *htx, const struct ist path, int with_qs) { struct buffer *temp = get_trash_chunk(); struct htx_sl *sl = http_get_stline(htx); @@ -413,8 +415,12 @@ int http_replace_req_path(struct htx *htx, const struct ist path) p = http_get_path(uri); if (!isttest(p)) p = uri; - while (plen < p.len && *(p.ptr + plen) != '?') - plen++; + if (with_qs) + plen = p.len; + else { + while (plen < p.len && *(p.ptr + plen) != '?') + plen++; + } /* Start by copying old method and version and create the new uri */ chunk_memcat(temp, HTX_SL_REQ_MPTR(sl), HTX_SL_REQ_MLEN(sl)); /* meth */