Format code
This commit is contained in:
parent
260422b7d7
commit
58b2814fda
@ -44,14 +44,10 @@ int main(void) {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Run servers
|
// Run servers
|
||||||
auto httpThread = std::thread([&]() {
|
auto httpThread = std::thread([&]() { http.listen("localhost", 8080); });
|
||||||
http.listen("localhost", 8080);
|
|
||||||
});
|
|
||||||
|
|
||||||
#ifdef CPPHTTPLIB_OPENSSL_SUPPORT
|
#ifdef CPPHTTPLIB_OPENSSL_SUPPORT
|
||||||
auto httpsThread = std::thread([&]() {
|
auto httpsThread = std::thread([&]() { https.listen("localhost", 8081); });
|
||||||
https.listen("localhost", 8081);
|
|
||||||
});
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
httpThread.join();
|
httpThread.join();
|
||||||
|
@ -5,13 +5,13 @@
|
|||||||
// MIT License
|
// MIT License
|
||||||
//
|
//
|
||||||
|
|
||||||
|
#include <fstream>
|
||||||
#include <httplib.h>
|
#include <httplib.h>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <fstream>
|
|
||||||
using namespace httplib;
|
using namespace httplib;
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
const char* html = R"(
|
const char *html = R"(
|
||||||
<form id="formElem">
|
<form id="formElem">
|
||||||
<input type="file" name="file" accept="image/*">
|
<input type="file" name="file" accept="image/*">
|
||||||
<input type="submit">
|
<input type="submit">
|
||||||
@ -35,9 +35,10 @@ int main(void) {
|
|||||||
res.set_content(html, "text/html");
|
res.set_content(html, "text/html");
|
||||||
});
|
});
|
||||||
|
|
||||||
svr.Post("/post", [](const Request & req, Response &res) {
|
svr.Post("/post", [](const Request &req, Response &res) {
|
||||||
auto file = req.get_file_value("file");
|
auto file = req.get_file_value("file");
|
||||||
cout << "file length: " << file.content.length() << ":" << file.filename << endl;
|
cout << "file length: " << file.content.length() << ":" << file.filename
|
||||||
|
<< endl;
|
||||||
|
|
||||||
ofstream ofs(file.filename, ios::binary);
|
ofstream ofs(file.filename, ios::binary);
|
||||||
ofs << file.content;
|
ofs << file.content;
|
||||||
|
71
test/test.cc
71
test/test.cc
@ -30,10 +30,11 @@ const std::string JSON_DATA = "{\"hello\":\"world\"}";
|
|||||||
|
|
||||||
const string LARGE_DATA = string(1024 * 1024 * 100, '@'); // 100MB
|
const string LARGE_DATA = string(1024 * 1024 * 100, '@'); // 100MB
|
||||||
|
|
||||||
MultipartFormData& get_file_value(MultipartFormDataItems &files, const char *key) {
|
MultipartFormData &get_file_value(MultipartFormDataItems &files,
|
||||||
auto it = std::find_if(files.begin(), files.end(), [&](const MultipartFormData &file) {
|
const char *key) {
|
||||||
return file.name == key;
|
auto it = std::find_if(
|
||||||
});
|
files.begin(), files.end(),
|
||||||
|
[&](const MultipartFormData &file) { return file.name == key; });
|
||||||
if (it != files.end()) { return *it; }
|
if (it != files.end()) { return *it; }
|
||||||
throw std::runtime_error("invalid mulitpart form data name error");
|
throw std::runtime_error("invalid mulitpart form data name error");
|
||||||
}
|
}
|
||||||
@ -496,15 +497,15 @@ TEST(DigestAuthTest, FromHTTPWatch) {
|
|||||||
|
|
||||||
{
|
{
|
||||||
std::vector<std::string> paths = {
|
std::vector<std::string> paths = {
|
||||||
"/digest-auth/auth/hello/world/MD5",
|
"/digest-auth/auth/hello/world/MD5",
|
||||||
"/digest-auth/auth/hello/world/SHA-256",
|
"/digest-auth/auth/hello/world/SHA-256",
|
||||||
"/digest-auth/auth/hello/world/SHA-512",
|
"/digest-auth/auth/hello/world/SHA-512",
|
||||||
"/digest-auth/auth-init/hello/world/MD5",
|
"/digest-auth/auth-init/hello/world/MD5",
|
||||||
"/digest-auth/auth-int/hello/world/MD5",
|
"/digest-auth/auth-int/hello/world/MD5",
|
||||||
};
|
};
|
||||||
|
|
||||||
cli.set_auth("hello", "world");
|
cli.set_auth("hello", "world");
|
||||||
for (auto path: paths) {
|
for (auto path : paths) {
|
||||||
auto res = cli.Get(path.c_str());
|
auto res = cli.Get(path.c_str());
|
||||||
ASSERT_TRUE(res != nullptr);
|
ASSERT_TRUE(res != nullptr);
|
||||||
EXPECT_EQ(res->body,
|
EXPECT_EQ(res->body,
|
||||||
@ -801,18 +802,19 @@ protected:
|
|||||||
EXPECT_EQ("5", req.get_header_value("Content-Length"));
|
EXPECT_EQ("5", req.get_header_value("Content-Length"));
|
||||||
})
|
})
|
||||||
.Post("/content_receiver",
|
.Post("/content_receiver",
|
||||||
[&](const Request & req, Response &res, const ContentReader &content_reader) {
|
[&](const Request &req, Response &res,
|
||||||
|
const ContentReader &content_reader) {
|
||||||
if (req.is_multipart_form_data()) {
|
if (req.is_multipart_form_data()) {
|
||||||
MultipartFormDataItems files;
|
MultipartFormDataItems files;
|
||||||
content_reader(
|
content_reader(
|
||||||
[&](const MultipartFormData &file) {
|
[&](const MultipartFormData &file) {
|
||||||
files.push_back(file);
|
files.push_back(file);
|
||||||
return true;
|
return true;
|
||||||
},
|
},
|
||||||
[&](const char *data, size_t data_length) {
|
[&](const char *data, size_t data_length) {
|
||||||
files.back().content.append(data, data_length);
|
files.back().content.append(data, data_length);
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
|
|
||||||
EXPECT_EQ(5u, files.size());
|
EXPECT_EQ(5u, files.size());
|
||||||
|
|
||||||
@ -1814,7 +1816,7 @@ TEST_F(ServerTest, MultipartFormDataGzip) {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Sends a raw request to a server listening at HOST:PORT.
|
// Sends a raw request to a server listening at HOST:PORT.
|
||||||
static bool send_request(time_t read_timeout_sec, const std::string& req) {
|
static bool send_request(time_t read_timeout_sec, const std::string &req) {
|
||||||
auto client_sock =
|
auto client_sock =
|
||||||
detail::create_client_socket(HOST, PORT, /*timeout_sec=*/5);
|
detail::create_client_socket(HOST, PORT, /*timeout_sec=*/5);
|
||||||
|
|
||||||
@ -1822,8 +1824,8 @@ static bool send_request(time_t read_timeout_sec, const std::string& req) {
|
|||||||
|
|
||||||
return detail::process_and_close_socket(
|
return detail::process_and_close_socket(
|
||||||
true, client_sock, 1, read_timeout_sec, 0,
|
true, client_sock, 1, read_timeout_sec, 0,
|
||||||
[&](Stream& strm, bool /*last_connection*/,
|
[&](Stream &strm, bool /*last_connection*/, bool &
|
||||||
bool &/*connection_close*/) -> bool {
|
/*connection_close*/) -> bool {
|
||||||
if (req.size() !=
|
if (req.size() !=
|
||||||
static_cast<size_t>(strm.write(req.data(), req.size()))) {
|
static_cast<size_t>(strm.write(req.data(), req.size()))) {
|
||||||
return false;
|
return false;
|
||||||
@ -1840,11 +1842,10 @@ static bool send_request(time_t read_timeout_sec, const std::string& req) {
|
|||||||
TEST(ServerRequestParsingTest, TrimWhitespaceFromHeaderValues) {
|
TEST(ServerRequestParsingTest, TrimWhitespaceFromHeaderValues) {
|
||||||
Server svr;
|
Server svr;
|
||||||
std::string header_value;
|
std::string header_value;
|
||||||
svr.Get("/validate-ws-in-headers",
|
svr.Get("/validate-ws-in-headers", [&](const Request &req, Response &res) {
|
||||||
[&](const Request &req, Response &res) {
|
header_value = req.get_header_value("foo");
|
||||||
header_value = req.get_header_value("foo");
|
res.set_content("ok", "text/plain");
|
||||||
res.set_content("ok", "text/plain");
|
});
|
||||||
});
|
|
||||||
|
|
||||||
thread t = thread([&] { svr.listen(HOST, PORT); });
|
thread t = thread([&] { svr.listen(HOST, PORT); });
|
||||||
while (!svr.is_running()) {
|
while (!svr.is_running()) {
|
||||||
@ -1853,11 +1854,10 @@ TEST(ServerRequestParsingTest, TrimWhitespaceFromHeaderValues) {
|
|||||||
|
|
||||||
// Only space and horizontal tab are whitespace. Make sure other whitespace-
|
// Only space and horizontal tab are whitespace. Make sure other whitespace-
|
||||||
// like characters are not treated the same - use vertical tab and escape.
|
// like characters are not treated the same - use vertical tab and escape.
|
||||||
const std::string req =
|
const std::string req = "GET /validate-ws-in-headers HTTP/1.1\r\n"
|
||||||
"GET /validate-ws-in-headers HTTP/1.1\r\n"
|
"foo: \t \v bar \e\t \r\n"
|
||||||
"foo: \t \v bar \e\t \r\n"
|
"Connection: close\r\n"
|
||||||
"Connection: close\r\n"
|
"\r\n";
|
||||||
"\r\n";
|
|
||||||
|
|
||||||
ASSERT_TRUE(send_request(5, req));
|
ASSERT_TRUE(send_request(5, req));
|
||||||
svr.stop();
|
svr.stop();
|
||||||
@ -1867,10 +1867,9 @@ TEST(ServerRequestParsingTest, TrimWhitespaceFromHeaderValues) {
|
|||||||
|
|
||||||
TEST(ServerRequestParsingTest, ReadHeadersRegexComplexity) {
|
TEST(ServerRequestParsingTest, ReadHeadersRegexComplexity) {
|
||||||
Server svr;
|
Server svr;
|
||||||
svr.Get("/hi",
|
svr.Get("/hi", [&](const Request & /*req*/, Response &res) {
|
||||||
[&](const Request & /*req*/, Response &res) {
|
res.set_content("ok", "text/plain");
|
||||||
res.set_content("ok", "text/plain");
|
});
|
||||||
});
|
|
||||||
|
|
||||||
// Server read timeout must be longer than the client read timeout for the
|
// Server read timeout must be longer than the client read timeout for the
|
||||||
// bug to reproduce, probably to force the server to process a request
|
// bug to reproduce, probably to force the server to process a request
|
||||||
|
Loading…
x
Reference in New Issue
Block a user