From 72be5e4efd3e63c0e17d87dfdcab78df12777e6b Mon Sep 17 00:00:00 2001 From: Christopher Faulet Date: Tue, 22 Nov 2022 15:41:48 +0100 Subject: [PATCH] BUG/MINOR: http-htx: Don't consider an URI as normalized after a set-uri action An abosulte URI is marked as normalized if it comes from an H2 client. This way, we know we can send a relative URI to an H1 server. But, after a set-uri action, the URI must no longer be considered as normalized. Otherwise there is no way to send an absolute URI on the server side. If it is important to update a normalized absolute URI without altering this property, the host, path and/or query-string must be set separatly. This patch should fix the issue #1938. It should be backported as far as 2.4. (cherry picked from commit 84cdbe478a82afdcaf4f049e8ed431ca349c6ba2) Signed-off-by: Christopher Faulet --- doc/configuration.txt | 8 +++++--- src/http_htx.c | 1 + 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/doc/configuration.txt b/doc/configuration.txt index 9364fa26a..8f9428372 100644 --- a/doc/configuration.txt +++ b/doc/configuration.txt @@ -7284,9 +7284,11 @@ http-request set-uri [ { if | unless } ] This rewrites the request URI with the result of the evaluation of format string . The scheme, authority, path and query string are all replaced - at once. This can be used to rewrite hosts in front of proxies, or to - perform complex modifications to the URI such as moving parts between the - path and the query string. + at once. This can be used to rewrite hosts in front of proxies, or to perform + complex modifications to the URI such as moving parts between the path and + the query string. If an absolute URI is set, it will be sent as is to + HTTP/1.1 servers. If it is not the desired behavior, the host, the path + and/or the query string should be set separately. See also "http-request set-path" and "http-request set-query". http-request set-var([, ...]) [ { if | unless } ] diff --git a/src/http_htx.c b/src/http_htx.c index d52ee5caf..de5a32177 100644 --- a/src/http_htx.c +++ b/src/http_htx.c @@ -390,6 +390,7 @@ int http_replace_req_uri(struct htx *htx, const struct ist uri) sl = http_get_stline(htx); ALREADY_CHECKED(sl); /* the stline exists because http_replace_stline() succeded */ + sl->flags &= ~HTX_SL_F_NORMALIZED_URI; if (!http_update_host(htx, sl, uri)) goto fail;