From 47eb12b95325d04af1d938130fdc73ad1902f5a5 Mon Sep 17 00:00:00 2001 From: Pascal Date: Tue, 24 Feb 2026 21:46:06 +0100 Subject: [PATCH] server: fix query params lost when proxying requests in multi-model router mode (#19854) * server: fix query params lost when proxying requests in multi-model router mode * server: re-encode query params using httplib::encode_query_component in proxy --- tools/server/server-http.cpp | 13 +++++++++++++ tools/server/server-http.h | 3 ++- tools/server/server-models.cpp | 6 +++++- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/tools/server/server-http.cpp b/tools/server/server-http.cpp index 00897eeea5..129022a711 100644 --- a/tools/server/server-http.cpp +++ b/tools/server/server-http.cpp @@ -339,6 +339,17 @@ static std::map get_headers(const httplib::Request & r return headers; } +static std::string build_query_string(const httplib::Request & req) { + std::string qs; + for (const auto & [key, value] : req.params) { + if (!qs.empty()) { + qs += '&'; + } + qs += httplib::encode_query_component(key) + "=" + httplib::encode_query_component(value); + } + return qs; +} + // using unique_ptr for request to allow safe capturing in lambdas using server_http_req_ptr = std::unique_ptr; @@ -382,6 +393,7 @@ void server_http_context::get(const std::string & path, const server_http_contex get_params(req), get_headers(req), req.path, + build_query_string(req), req.body, req.is_connection_closed }); @@ -396,6 +408,7 @@ void server_http_context::post(const std::string & path, const server_http_conte get_params(req), get_headers(req), req.path, + build_query_string(req), req.body, req.is_connection_closed }); diff --git a/tools/server/server-http.h b/tools/server/server-http.h index 24c0b40117..3621064cdf 100644 --- a/tools/server/server-http.h +++ b/tools/server/server-http.h @@ -36,7 +36,8 @@ using server_http_res_ptr = std::unique_ptr; struct server_http_req { std::map params; // path_params + query_params std::map headers; // reserved for future use - std::string path; // reserved for future use + std::string path; + std::string query_string; // query parameters string (e.g. "action=save") std::string body; const std::function & should_stop; diff --git a/tools/server/server-models.cpp b/tools/server/server-models.cpp index 57655476af..efb22da5c3 100644 --- a/tools/server/server-models.cpp +++ b/tools/server/server-models.cpp @@ -697,11 +697,15 @@ server_http_res_ptr server_models::proxy_request(const server_http_req & req, co mapping[name].meta.last_used = ggml_time_ms(); } SRV_INF("proxying request to model %s on port %d\n", name.c_str(), meta->port); + std::string proxy_path = req.path; + if (!req.query_string.empty()) { + proxy_path += '?' + req.query_string; + } auto proxy = std::make_unique( method, CHILD_ADDR, meta->port, - req.path, + proxy_path, req.headers, req.body, req.should_stop,