Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
  • Loading branch information
yhirose committed Jul 29, 2023
1 parent aabf752 commit ec87b04
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 4 deletions.
7 changes: 3 additions & 4 deletions httplib.h
Original file line number Diff line number Diff line change
Expand Up @@ -4267,9 +4267,9 @@ class MultipartFormDataParser {
buf_erase(crlf_.size());
state_ = 1;
} else {
if (dash_crlf_.size() > buf_size()) { return true; }
if (buf_start_with(dash_crlf_)) {
buf_erase(dash_crlf_.size());
if (dash_.size() > buf_size()) { return true; }
if (buf_start_with(dash_)) {
buf_erase(dash_.size());
is_valid_ = true;
buf_erase(buf_size()); // Remove epilogue
} else {
Expand Down Expand Up @@ -4302,7 +4302,6 @@ class MultipartFormDataParser {

const std::string dash_ = "--";
const std::string crlf_ = "\r\n";
const std::string dash_crlf_ = "--\r\n";
std::string boundary_;
std::string dash_boundary_crlf_;
std::string crlf_dash_boundary_;
Expand Down
51 changes: 51 additions & 0 deletions test/test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -6106,6 +6106,8 @@ TEST(MultipartFormDataTest, PutInvalidBoundaryChars) {
}

TEST(MultipartFormDataTest, AlternateFilename) {
auto handled = false;

Server svr;
svr.Post("/test", [&](const Request &req, Response &res) {
ASSERT_EQ(3u, req.files.size());
Expand All @@ -6130,13 +6132,16 @@ TEST(MultipartFormDataTest, AlternateFilename) {
ASSERT_EQ("text default", it->second.content);

res.set_content("ok", "text/plain");

handled = true;
});

thread t = thread([&] { svr.listen(HOST, PORT); });
auto se = detail::scope_exit([&] {
svr.stop();
t.join();
ASSERT_FALSE(svr.is_running());
ASSERT_TRUE(handled);
});

svr.wait_until_ready();
Expand Down Expand Up @@ -6168,6 +6173,52 @@ TEST(MultipartFormDataTest, AlternateFilename) {
ASSERT_TRUE(send_request(1, req));
}

TEST(MultipartFormDataTest, CloseDelimiterWithoutCRLF) {
auto handled = false;

Server svr;
svr.Post("/test", [&](const Request &req, Response &) {
ASSERT_EQ(2u, req.files.size());

auto it = req.files.begin();
ASSERT_EQ("text1", it->second.name);
ASSERT_EQ("text1", it->second.content);

++it;
ASSERT_EQ("text2", it->second.name);
ASSERT_EQ("text2", it->second.content);

handled = true;
});

thread t = thread([&] { svr.listen(HOST, PORT); });
auto se = detail::scope_exit([&] {
svr.stop();
t.join();
ASSERT_FALSE(svr.is_running());
ASSERT_TRUE(handled);
});

svr.wait_until_ready();

auto req = "POST /test HTTP/1.1\r\n"
"Content-Type: multipart/form-data;boundary=--------\r\n"
"Content-Length: 146\r\n"
"\r\n----------\r\n"
"Content-Disposition: form-data; name=\"text1\"\r\n"
"\r\n"
"text1"
"\r\n----------\r\n"
"Content-Disposition: form-data; name=\"text2\"\r\n"
"\r\n"
"text2"
"\r\n------------";

std::string resonse;
ASSERT_TRUE(send_request(1, req, &resonse));
ASSERT_EQ("200", resonse.substr(9, 3));
}

#endif

#ifndef _WIN32
Expand Down

0 comments on commit ec87b04

Please sign in to comment.