From 1e4d9004bd9e1406924615893b7d74f2c4735a08 Mon Sep 17 00:00:00 2001 From: yhirose Date: Wed, 27 Nov 2024 11:36:58 -0500 Subject: [PATCH] Fix #1985 --- httplib.h | 16 ++++++++++------ test/test.cc | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 6 deletions(-) diff --git a/httplib.h b/httplib.h index bfad4fffeb..c671b8dbe0 100644 --- a/httplib.h +++ b/httplib.h @@ -612,6 +612,7 @@ using Ranges = std::vector; struct Request { std::string method; std::string path; + Params params; Headers headers; std::string body; @@ -623,7 +624,6 @@ struct Request { // for server std::string version; std::string target; - Params params; MultipartFormDataMap files; Ranges ranges; Match matches; @@ -7420,7 +7420,7 @@ inline bool ClientImpl::send(Request &req, Response &res, Error &error) { inline bool ClientImpl::is_ssl_peer_could_be_closed(SSL *ssl) const { char buf[1]; return !SSL_peek(ssl, buf, 1) && - SSL_get_error(ssl, 0) == SSL_ERROR_ZERO_RETURN; + SSL_get_error(ssl, 0) == SSL_ERROR_ZERO_RETURN; } #endif @@ -7438,9 +7438,7 @@ inline bool ClientImpl::send_(Request &req, Response &res, Error &error) { #ifdef CPPHTTPLIB_OPENSSL_SUPPORT if (is_alive && is_ssl()) { - if (is_ssl_peer_could_be_closed(socket_.ssl)) { - is_alive = false; - } + if (is_ssl_peer_could_be_closed(socket_.ssl)) { is_alive = false; } } #endif @@ -7799,7 +7797,13 @@ inline bool ClientImpl::write_request(Stream &strm, Request &req, { detail::BufferStream bstrm; - const auto &path = url_encode_ ? detail::encode_url(req.path) : req.path; + const auto &path_with_query = + req.params.empty() ? req.path + : append_query_params(req.path, req.params); + + const auto &path = + url_encode_ ? detail::encode_url(path_with_query) : path_with_query; + detail::write_request_line(bstrm, req.method, path); header_writer_(bstrm, req.headers); diff --git a/test/test.cc b/test/test.cc index d2aa07afa5..6ce6c8cb48 100644 --- a/test/test.cc +++ b/test/test.cc @@ -6542,6 +6542,40 @@ TEST(SendAPI, SimpleInterface_Online) { EXPECT_EQ(StatusCode::MovedPermanently_301, res->status); } +TEST(SendAPI, WithParamsInRequest) { + Server svr; + + svr.Get("/", [&](const Request &req, Response & /*res*/) { + EXPECT_TRUE(req.has_param("test")); + EXPECT_EQ("test_value", req.get_param_value("test")); + }); + + auto t = std::thread([&]() { svr.listen(HOST, PORT); }); + + auto se = detail::scope_exit([&] { + svr.stop(); + t.join(); + ASSERT_FALSE(svr.is_running()); + }); + + svr.wait_until_ready(); + + Client cli(HOST, PORT); + + { + Request req; + req.method = "GET"; + req.path = "/"; + req.params.emplace("test", "test_value"); + auto res = cli.send(req); + ASSERT_TRUE(res); + } + { + auto res = cli.Get("/", {{"test", "test_value"}}, Headers{}); + ASSERT_TRUE(res); + } +} + TEST(ClientImplMethods, GetSocketTest) { httplib::Server svr; svr.Get("/", [&](const httplib::Request & /*req*/, httplib::Response &res) {