Skip to content

Commit e428621

Browse files
committed
Added Get with Params
1 parent 8d9a477 commit e428621

File tree

2 files changed

+103
-28
lines changed

2 files changed

+103
-28
lines changed

httplib.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -820,6 +820,7 @@ class ClientImpl {
820820
Result Get(const char *path, const Headers &headers,
821821
ResponseHandler response_handler, ContentReceiver content_receiver,
822822
Progress progress);
823+
Result Get(const char *path, const Params &params);
823824

824825
Result Head(const char *path);
825826
Result Head(const char *path, const Headers &headers);
@@ -1113,6 +1114,7 @@ class Client {
11131114
Progress progress);
11141115
Result Get(const char *path, ResponseHandler response_handler,
11151116
ContentReceiver content_receiver, Progress progress);
1117+
Result Get(const char *path, const Params &params);
11161118

11171119
Result Head(const char *path);
11181120
Result Head(const char *path, const Headers &headers);
@@ -5700,6 +5702,19 @@ inline Result ClientImpl::Get(const char *path, const Headers &headers,
57005702
return send(req);
57015703
}
57025704

5705+
inline Result ClientImpl::Get(const char *path,
5706+
const Params &params) {
5707+
if (params.empty()) { return Get(path); }
5708+
5709+
std::string path_with_query = path;
5710+
{
5711+
const static std::regex re("[^?]+\\?.*");
5712+
auto delm = std::regex_match(path, re) ? '&' : '?';
5713+
path_with_query += delm + detail::params_to_query_str(params);
5714+
}
5715+
return Get(path_with_query.c_str(), Headers(), Progress());
5716+
}
5717+
57035718
inline Result ClientImpl::Head(const char *path) {
57045719
return Head(path, Headers());
57055720
}
@@ -6924,6 +6939,9 @@ inline Result Client::Get(const char *path, const Headers &headers,
69246939
return cli_->Get(path, headers, std::move(response_handler),
69256940
std::move(content_receiver), std::move(progress));
69266941
}
6942+
inline Result Client::Get(const char *path, const Params &params) {
6943+
return cli_->Get(path, params);
6944+
}
69276945

69286946
inline Result Client::Head(const char *path) { return cli_->Head(path); }
69296947
inline Result Client::Head(const char *path, const Headers &headers) {

test/test.cc

Lines changed: 85 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -652,8 +652,9 @@ TEST(BaseAuthTest, FromHTTPWatch) {
652652
}
653653

654654
{
655-
auto res = cli.Get("/basic-auth/hello/world",
656-
{make_basic_authentication_header("hello", "world")});
655+
auto res =
656+
cli.Get("/basic-auth/hello/world",
657+
Headers{make_basic_authentication_header("hello", "world")});
657658
ASSERT_TRUE(res);
658659
EXPECT_EQ("{\n \"authenticated\": true, \n \"user\": \"hello\"\n}\n",
659660
res->body);
@@ -816,6 +817,31 @@ TEST(HttpsToHttpRedirectTest, Redirect) {
816817
EXPECT_EQ(200, res->status);
817818
}
818819

820+
TEST(HttpsToHttpRedirectTest2, Redirect) {
821+
SSLClient cli("nghttp2.org");
822+
cli.set_follow_location(true);
823+
824+
Params params;
825+
params.emplace("url", "http://www.google.com");
826+
params.emplace("status_code", "302");
827+
828+
auto res = cli.Get("/httpbin/redirect-to", params);
829+
ASSERT_TRUE(res);
830+
EXPECT_EQ(200, res->status);
831+
}
832+
833+
TEST(HttpsToHttpRedirectTest3, Redirect) {
834+
SSLClient cli("nghttp2.org");
835+
cli.set_follow_location(true);
836+
837+
Params params;
838+
params.emplace("url", "http://www.google.com");
839+
840+
auto res = cli.Get("/httpbin/redirect-to?status_code=302", params);
841+
ASSERT_TRUE(res);
842+
EXPECT_EQ(200, res->status);
843+
}
844+
819845
TEST(RedirectToDifferentPort, Redirect) {
820846
Server svr8080;
821847
Server svr8081;
@@ -956,9 +982,8 @@ TEST(ErrorHandlerTest, ContentLength) {
956982
TEST(NoContentTest, ContentLength) {
957983
Server svr;
958984

959-
svr.Get("/hi", [](const Request & /*req*/, Response &res) {
960-
res.status = 204;
961-
});
985+
svr.Get("/hi",
986+
[](const Request & /*req*/, Response &res) { res.status = 204; });
962987
auto thread = std::thread([&]() { svr.listen(HOST, PORT); });
963988

964989
// Give GET time to get a few messages.
@@ -1853,7 +1878,8 @@ TEST_F(ServerTest, UserDefinedMIMETypeMapping) {
18531878
}
18541879

18551880
TEST_F(ServerTest, StaticFileRange) {
1856-
auto res = cli_.Get("/dir/test.abcde", {{make_range_header({{2, 3}})}});
1881+
auto res =
1882+
cli_.Get("/dir/test.abcde", Headers{{make_range_header({{2, 3}})}});
18571883
ASSERT_TRUE(res);
18581884
EXPECT_EQ(206, res->status);
18591885
EXPECT_EQ("text/abcde", res->get_header_value("Content-Type"));
@@ -2156,7 +2182,7 @@ TEST_F(ServerTest, CaseInsensitiveTransferEncoding) {
21562182
}
21572183

21582184
TEST_F(ServerTest, GetStreamed2) {
2159-
auto res = cli_.Get("/streamed", {{make_range_header({{2, 3}})}});
2185+
auto res = cli_.Get("/streamed", Headers{{make_range_header({{2, 3}})}});
21602186
ASSERT_TRUE(res);
21612187
EXPECT_EQ(206, res->status);
21622188
EXPECT_EQ("2", res->get_header_value("Content-Length"));
@@ -2172,7 +2198,8 @@ TEST_F(ServerTest, GetStreamed) {
21722198
}
21732199

21742200
TEST_F(ServerTest, GetStreamedWithRange1) {
2175-
auto res = cli_.Get("/streamed-with-range", {{make_range_header({{3, 5}})}});
2201+
auto res =
2202+
cli_.Get("/streamed-with-range", Headers{{make_range_header({{3, 5}})}});
21762203
ASSERT_TRUE(res);
21772204
EXPECT_EQ(206, res->status);
21782205
EXPECT_EQ("3", res->get_header_value("Content-Length"));
@@ -2181,7 +2208,8 @@ TEST_F(ServerTest, GetStreamedWithRange1) {
21812208
}
21822209

21832210
TEST_F(ServerTest, GetStreamedWithRange2) {
2184-
auto res = cli_.Get("/streamed-with-range", {{make_range_header({{1, -1}})}});
2211+
auto res =
2212+
cli_.Get("/streamed-with-range", Headers{{make_range_header({{1, -1}})}});
21852213
ASSERT_TRUE(res);
21862214
EXPECT_EQ(206, res->status);
21872215
EXPECT_EQ("6", res->get_header_value("Content-Length"));
@@ -2190,7 +2218,7 @@ TEST_F(ServerTest, GetStreamedWithRange2) {
21902218
}
21912219

21922220
TEST_F(ServerTest, GetStreamedWithRangeSuffix1) {
2193-
auto res = cli_.Get("/streamed-with-range", {{"Range", "bytes=-3"}});
2221+
auto res = cli_.Get("/streamed-with-range", Headers{{"Range", "bytes=-3"}});
21942222
ASSERT_TRUE(res);
21952223
EXPECT_EQ(206, res->status);
21962224
EXPECT_EQ("3", res->get_header_value("Content-Length"));
@@ -2199,7 +2227,8 @@ TEST_F(ServerTest, GetStreamedWithRangeSuffix1) {
21992227
}
22002228

22012229
TEST_F(ServerTest, GetStreamedWithRangeSuffix2) {
2202-
auto res = cli_.Get("/streamed-with-range", {{"Range", "bytes=-9999"}});
2230+
auto res =
2231+
cli_.Get("/streamed-with-range", Headers{{"Range", "bytes=-9999"}});
22032232
ASSERT_TRUE(res);
22042233
EXPECT_EQ(206, res->status);
22052234
EXPECT_EQ("7", res->get_header_value("Content-Length"));
@@ -2208,25 +2237,26 @@ TEST_F(ServerTest, GetStreamedWithRangeSuffix2) {
22082237
}
22092238

22102239
TEST_F(ServerTest, GetStreamedWithRangeError) {
2211-
auto res = cli_.Get("/streamed-with-range",
2212-
{{"Range", "bytes=92233720368547758079223372036854775806-"
2240+
auto res =
2241+
cli_.Get("/streamed-with-range",
2242+
Headers{{"Range", "bytes=92233720368547758079223372036854775806-"
22132243
"92233720368547758079223372036854775807"}});
22142244
ASSERT_TRUE(res);
22152245
EXPECT_EQ(416, res->status);
22162246
}
22172247

22182248
TEST_F(ServerTest, GetRangeWithMaxLongLength) {
2219-
auto res =
2220-
cli_.Get("/with-range", {{"Range", "bytes=0-9223372036854775807"}});
2249+
auto res = cli_.Get("/with-range",
2250+
Headers{{"Range", "bytes=0-9223372036854775807"}});
22212251
EXPECT_EQ(206, res->status);
22222252
EXPECT_EQ("7", res->get_header_value("Content-Length"));
22232253
EXPECT_EQ(true, res->has_header("Content-Range"));
22242254
EXPECT_EQ(std::string("abcdefg"), res->body);
22252255
}
22262256

22272257
TEST_F(ServerTest, GetStreamedWithRangeMultipart) {
2228-
auto res =
2229-
cli_.Get("/streamed-with-range", {{make_range_header({{1, 2}, {4, 5}})}});
2258+
auto res = cli_.Get("/streamed-with-range",
2259+
Headers{{make_range_header({{1, 2}, {4, 5}})}});
22302260
ASSERT_TRUE(res);
22312261
EXPECT_EQ(206, res->status);
22322262
EXPECT_EQ("269", res->get_header_value("Content-Length"));
@@ -2270,7 +2300,7 @@ TEST_F(ServerTest, ClientStop) {
22702300
}
22712301

22722302
TEST_F(ServerTest, GetWithRange1) {
2273-
auto res = cli_.Get("/with-range", {{make_range_header({{3, 5}})}});
2303+
auto res = cli_.Get("/with-range", Headers{{make_range_header({{3, 5}})}});
22742304
ASSERT_TRUE(res);
22752305
EXPECT_EQ(206, res->status);
22762306
EXPECT_EQ("3", res->get_header_value("Content-Length"));
@@ -2279,7 +2309,7 @@ TEST_F(ServerTest, GetWithRange1) {
22792309
}
22802310

22812311
TEST_F(ServerTest, GetWithRange2) {
2282-
auto res = cli_.Get("/with-range", {{make_range_header({{1, -1}})}});
2312+
auto res = cli_.Get("/with-range", Headers{{make_range_header({{1, -1}})}});
22832313
ASSERT_TRUE(res);
22842314
EXPECT_EQ(206, res->status);
22852315
EXPECT_EQ("6", res->get_header_value("Content-Length"));
@@ -2288,7 +2318,7 @@ TEST_F(ServerTest, GetWithRange2) {
22882318
}
22892319

22902320
TEST_F(ServerTest, GetWithRange3) {
2291-
auto res = cli_.Get("/with-range", {{make_range_header({{0, 0}})}});
2321+
auto res = cli_.Get("/with-range", Headers{{make_range_header({{0, 0}})}});
22922322
ASSERT_TRUE(res);
22932323
EXPECT_EQ(206, res->status);
22942324
EXPECT_EQ("1", res->get_header_value("Content-Length"));
@@ -2297,7 +2327,7 @@ TEST_F(ServerTest, GetWithRange3) {
22972327
}
22982328

22992329
TEST_F(ServerTest, GetWithRange4) {
2300-
auto res = cli_.Get("/with-range", {{make_range_header({{-1, 2}})}});
2330+
auto res = cli_.Get("/with-range", Headers{{make_range_header({{-1, 2}})}});
23012331
ASSERT_TRUE(res);
23022332
EXPECT_EQ(206, res->status);
23032333
EXPECT_EQ("2", res->get_header_value("Content-Length"));
@@ -2306,13 +2336,15 @@ TEST_F(ServerTest, GetWithRange4) {
23062336
}
23072337

23082338
TEST_F(ServerTest, GetWithRangeOffsetGreaterThanContent) {
2309-
auto res = cli_.Get("/with-range", {{make_range_header({{10000, 20000}})}});
2339+
auto res =
2340+
cli_.Get("/with-range", Headers{{make_range_header({{10000, 20000}})}});
23102341
ASSERT_TRUE(res);
23112342
EXPECT_EQ(416, res->status);
23122343
}
23132344

23142345
TEST_F(ServerTest, GetWithRangeMultipart) {
2315-
auto res = cli_.Get("/with-range", {{make_range_header({{1, 2}, {4, 5}})}});
2346+
auto res =
2347+
cli_.Get("/with-range", Headers{{make_range_header({{1, 2}, {4, 5}})}});
23162348
ASSERT_TRUE(res);
23172349
EXPECT_EQ(206, res->status);
23182350
EXPECT_EQ("269", res->get_header_value("Content-Length"));
@@ -2321,8 +2353,8 @@ TEST_F(ServerTest, GetWithRangeMultipart) {
23212353
}
23222354

23232355
TEST_F(ServerTest, GetWithRangeMultipartOffsetGreaterThanContent) {
2324-
auto res =
2325-
cli_.Get("/with-range", {{make_range_header({{-1, 2}, {10000, 30000}})}});
2356+
auto res = cli_.Get("/with-range",
2357+
Headers{{make_range_header({{-1, 2}, {10000, 30000}})}});
23262358
ASSERT_TRUE(res);
23272359
EXPECT_EQ(416, res->status);
23282360
}
@@ -3968,8 +4000,8 @@ TEST(YahooRedirectTest3, NewResultInterface) {
39684000
#ifdef CPPHTTPLIB_BROTLI_SUPPORT
39694001
TEST(DecodeWithChunkedEncoding, BrotliEncoding) {
39704002
Client cli("https://cdnjs.cloudflare.com");
3971-
auto res =
3972-
cli.Get("/ajax/libs/jquery/3.5.1/jquery.js", {{"Accept-Encoding", "br"}});
4003+
auto res = cli.Get("/ajax/libs/jquery/3.5.1/jquery.js",
4004+
Headers{{"Accept-Encoding", "br"}});
39734005

39744006
ASSERT_TRUE(res);
39754007
EXPECT_EQ(200, res->status);
@@ -3979,7 +4011,7 @@ TEST(DecodeWithChunkedEncoding, BrotliEncoding) {
39794011
}
39804012
#endif
39814013

3982-
TEST(HttpsToHttpRedirectTest2, SimpleInterface) {
4014+
TEST(HttpsToHttpRedirectTest, SimpleInterface) {
39834015
Client cli("https://nghttp2.org");
39844016
cli.set_follow_location(true);
39854017
auto res =
@@ -3989,4 +4021,29 @@ TEST(HttpsToHttpRedirectTest2, SimpleInterface) {
39894021
ASSERT_TRUE(res);
39904022
EXPECT_EQ(200, res->status);
39914023
}
4024+
4025+
TEST(HttpsToHttpRedirectTest2, SimpleInterface) {
4026+
Client cli("https://nghttp2.org");
4027+
cli.set_follow_location(true);
4028+
4029+
Params params;
4030+
params.emplace("url", "http://www.google.com");
4031+
params.emplace("status_code", "302");
4032+
4033+
auto res = cli.Get("/httpbin/redirect-to", params);
4034+
ASSERT_TRUE(res);
4035+
EXPECT_EQ(200, res->status);
4036+
}
4037+
4038+
TEST(HttpsToHttpRedirectTest3, SimpleInterface) {
4039+
Client cli("https://nghttp2.org");
4040+
cli.set_follow_location(true);
4041+
4042+
Params params;
4043+
params.emplace("url", "http://www.google.com");
4044+
4045+
auto res = cli.Get("/httpbin/redirect-to?status_code=302", params);
4046+
ASSERT_TRUE(res);
4047+
EXPECT_EQ(200, res->status);
4048+
}
39924049
#endif

0 commit comments

Comments
 (0)