BUG/MINOR: mux-fcgi: Don't send normalized uri to FCGI application
A normalized URI is the internal term used to specify an URI is stored using
the absolute format (scheme + authority + path). For now, it is only used
for H2 clients. It is the default and recommended format for H2 request.
However, it is unusual for H1 servers to receive such URI. So in this case,
we only send the path of the absolute URI. It is performed for H1 servers,
but not for FCGI applications. This patch fixes the difference.
Note that it is not a real bug, because FCGI applications should support
abosolute URI.
Note also a normalized URI is only detected for H2 clients when a request is
received. There is no such test on the H1 side. It means an absolute URI
received from an H1 client will be sent without modification to an H1 server
or a FCGI application.
To make it possible, a dedicated function has been added to get the H1
URI. This function is called by the H1 and the FCGI multiplexer when a
request is sent to a server.
This patch should fix the issue #1232. It must be backported as far as 2.2.
(cherry picked from commit fb38c910f8f2bdf1b32ec74824d8f8a8f9a29a8f)
Signed-off-by: Christopher Faulet <cfaulet@haproxy.com>
diff --git a/src/h1_htx.c b/src/h1_htx.c
index 56ee357..c57e448 100644
--- a/src/h1_htx.c
+++ b/src/h1_htx.c
@@ -633,17 +633,7 @@
struct ist uri;
size_t sz = chk->data;
- uri = htx_sl_req_uri(sl);
- if (sl->flags & HTX_SL_F_NORMALIZED_URI) {
- uri = http_get_path(uri);
- if (unlikely(!uri.len)) {
- if (sl->info.req.meth == HTTP_METH_OPTIONS)
- uri = ist("*");
- else
- uri = ist("/");
- }
- }
-
+ uri = h1_get_uri(sl);
if (!chunk_memcat(chk, HTX_SL_REQ_MPTR(sl), HTX_SL_REQ_MLEN(sl)) ||
!chunk_memcat(chk, " ", 1) ||
!chunk_memcat(chk, uri.ptr, uri.len) ||
diff --git a/src/mux_fcgi.c b/src/mux_fcgi.c
index 5f3989a..68954c0 100644
--- a/src/mux_fcgi.c
+++ b/src/mux_fcgi.c
@@ -1227,7 +1227,7 @@
chunk_memcat(params->p, p.ptr, p.len);
}
if (!(params->mask & FCGI_SP_REQ_URI)) {
- p = htx_sl_req_uri(sl);
+ p = h1_get_uri(sl);
params->uri = ist2(b_tail(params->p), p.len);
chunk_memcat(params->p, p.ptr, p.len);
}