Skip to content
This repository was archived by the owner on Apr 30, 2025. It is now read-only.

Commit 88f6245

Browse files
authored
feat: Add Request::get_file_multi_value func. (yhirose#1495)
Support to get multiple values of a key. perf: Rename function names, variable names etc.
1 parent 0e7d2f9 commit 88f6245

File tree

2 files changed

+61
-0
lines changed

2 files changed

+61
-0
lines changed

httplib.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -454,6 +454,7 @@ struct Request {
454454

455455
bool has_file(const std::string &key) const;
456456
MultipartFormData get_file_value(const std::string &key) const;
457+
std::vector<MultipartFormData> get_file_values(const std::string &key) const;
457458

458459
// private members...
459460
size_t redirect_count_ = CPPHTTPLIB_REDIRECT_MAX_COUNT;
@@ -4690,6 +4691,15 @@ inline MultipartFormData Request::get_file_value(const std::string &key) const {
46904691
return MultipartFormData();
46914692
}
46924693

4694+
inline std::vector<MultipartFormData> Request::get_file_values(const std::string &key) const {
4695+
std::vector<MultipartFormData> values;
4696+
auto rng = files.equal_range(key);
4697+
for (auto it = rng.first; it != rng.second; it++) {
4698+
values.push_back(it->second);
4699+
}
4700+
return values;
4701+
}
4702+
46934703
// Response implementation
46944704
inline bool Response::has_header(const std::string &key) const {
46954705
return headers.find(key) != headers.end();

test/test.cc

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1767,6 +1767,40 @@ class ServerTest : public ::testing::Test {
17671767
EXPECT_EQ("application/json tmp-string", file.content_type);
17681768
}
17691769
})
1770+
.Post("/multipart/multi_file_values",
1771+
[&](const Request &req, Response & /*res*/) {
1772+
EXPECT_EQ(5u, req.files.size());
1773+
ASSERT_TRUE(!req.has_file("???"));
1774+
ASSERT_TRUE(req.body.empty());
1775+
1776+
{
1777+
const auto &text_value = req.get_file_values("text");
1778+
EXPECT_EQ(text_value.size(), 1);
1779+
auto &text = text_value[0];
1780+
EXPECT_TRUE(text.filename.empty());
1781+
EXPECT_EQ("defalut text", text.content);
1782+
}
1783+
{
1784+
const auto &text1_values = req.get_file_values("multi_text1");
1785+
EXPECT_EQ(text1_values.size(), 2);
1786+
EXPECT_EQ("aaaaa", text1_values[0].content);
1787+
EXPECT_EQ("bbbbb", text1_values[1].content);
1788+
}
1789+
1790+
{
1791+
const auto &file1_values = req.get_file_values("multi_file1");
1792+
EXPECT_EQ(file1_values.size(), 2);
1793+
auto file1 = file1_values[0];
1794+
EXPECT_EQ(file1.filename, "hello.txt");
1795+
EXPECT_EQ(file1.content_type, "text/plain");
1796+
EXPECT_EQ("h\ne\n\nl\nl\no\n", file1.content);
1797+
1798+
auto file2 = file1_values[1];
1799+
EXPECT_EQ(file2.filename, "world.json");
1800+
EXPECT_EQ(file2.content_type, "application/json");
1801+
EXPECT_EQ("{\n \"world\", true\n}\n", file2.content);
1802+
}
1803+
})
17701804
.Post("/empty",
17711805
[&](const Request &req, Response &res) {
17721806
EXPECT_EQ(req.body, "");
@@ -2611,6 +2645,23 @@ TEST_F(ServerTest, MultipartFormData) {
26112645
EXPECT_EQ(200, res->status);
26122646
}
26132647

2648+
TEST_F(ServerTest, MultipartFormDataMultiFileValues) {
2649+
MultipartFormDataItems items = {
2650+
{"text", "defalut text", "", ""},
2651+
2652+
{"multi_text1", "aaaaa", "", ""},
2653+
{"multi_text1", "bbbbb", "", ""},
2654+
2655+
{"multi_file1", "h\ne\n\nl\nl\no\n", "hello.txt", "text/plain"},
2656+
{"multi_file1", "{\n \"world\", true\n}\n", "world.json", "application/json"},
2657+
};
2658+
2659+
auto res = cli_.Post("/multipart/multi_file_values", items);
2660+
2661+
ASSERT_TRUE(res);
2662+
EXPECT_EQ(200, res->status);
2663+
}
2664+
26142665
TEST_F(ServerTest, CaseInsensitiveHeaderName) {
26152666
auto res = cli_.Get("/hi");
26162667
ASSERT_TRUE(res);

0 commit comments

Comments
 (0)