Revert "Changed set_file_content to accept only a regular file path."
This reverts commit 7ab9c119efb0d1a2f139e6d53da105b9e214b596.
diff --git a/README.md b/README.md
index 10465fb..0a52512 100644
--- a/README.md
+++ b/README.md
@@ -97,33 +97,37 @@
Server svr;
- svr.Get("/hi", [](const Request &req, Response &res) {
+ svr.Get("/hi", [](const Request& req, Response& res) {
res.set_content("Hello World!", "text/plain");
});
// Match the request path against a regular expression
// and extract its captures
- svr.Get(R"(/numbers/(\d+))", [&](const Request &req, Response &res) {
+ svr.Get(R"(/numbers/(\d+))", [&](const Request& req, Response& res) {
auto numbers = req.matches[1];
res.set_content(numbers, "text/plain");
});
// Capture the second segment of the request path as "id" path param
- svr.Get("/users/:id", [&](const Request &req, Response &res) {
+ svr.Get("/users/:id", [&](const Request& req, Response& res) {
auto user_id = req.path_params.at("id");
res.set_content(user_id, "text/plain");
});
// Extract values from HTTP headers and URL query params
- svr.Get("/body-header-param", [](const Request &req, Response &res) {
+ svr.Get("/body-header-param", [](const Request& req, Response& res) {
if (req.has_header("Content-Length")) {
auto val = req.get_header_value("Content-Length");
}
- if (req.has_param("key")) { auto val = req.get_param_value("key"); }
+ if (req.has_param("key")) {
+ auto val = req.get_param_value("key");
+ }
res.set_content(req.body, "text/plain");
});
- svr.Get("/stop", [&](const Request &req, Response &res) { svr.stop(); });
+ svr.Get("/stop", [&](const Request& req, Response& res) {
+ svr.stop();
+ });
svr.listen("localhost", 1234);
}
@@ -272,7 +276,7 @@
svr.Post("/multipart", [&](const auto& req, auto& res) {
auto size = req.files.size();
auto ret = req.has_file("name1");
- const auto &file = req.get_file_value("name1");
+ const auto& file = req.get_file_value("name1");
// file.filename;
// file.content_type;
// file.content;
@@ -284,10 +288,10 @@
```cpp
svr.Post("/content_receiver",
[&](const Request &req, Response &res, const ContentReader &content_reader) {
- if (req.is_multipart_form_data()) {
- // NOTE: `content_reader` is blocking until every form data field is read
- MultipartFormDataItems files;
- content_reader(
+ if (req.is_multipart_form_data()) {
+ // NOTE: `content_reader` is blocking until every form data field is read
+ MultipartFormDataItems files;
+ content_reader(
[&](const MultipartFormData &file) {
files.push_back(file);
return true;
@@ -296,13 +300,13 @@
files.back().content.append(data, data_length);
return true;
});
- } else {
- std::string body;
- content_reader([&](const char *data, size_t data_length) {
- body.append(data, data_length);
- return true;
- });
- }
+ } else {
+ std::string body;
+ content_reader([&](const char *data, size_t data_length) {
+ body.append(data, data_length);
+ return true;
+ });
+ }
});
```
@@ -315,14 +319,14 @@
auto data = new std::string("abcdefg");
res.set_content_provider(
- data->size(), // Content length
- "text/plain", // Content type
- [&, data](size_t offset, size_t length, DataSink &sink) {
- const auto &d = *data;
- sink.write(&d[offset], std::min(length, DATA_CHUNK_SIZE));
- return true; // return 'false' if you want to cancel the process.
- },
- [data](bool success) { delete data; });
+ data->size(), // Content length
+ "text/plain", // Content type
+ [&, data](size_t offset, size_t length, DataSink &sink) {
+ const auto &d = *data;
+ sink.write(&d[offset], std::min(length, DATA_CHUNK_SIZE));
+ return true; // return 'false' if you want to cancel the process.
+ },
+ [data](bool success) { delete data; });
});
```
@@ -331,17 +335,17 @@
```cpp
svr.Get("/stream", [&](const Request &req, Response &res) {
res.set_content_provider(
- "text/plain", // Content type
- [&](size_t offset, DataSink &sink) {
- if (/* there is still data */) {
- std::vector<char> data;
- // prepare data...
- sink.write(data.data(), data.size());
- } else {
- sink.done(); // No more data
- }
- return true; // return 'false' if you want to cancel the process.
- });
+ "text/plain", // Content type
+ [&](size_t offset, DataSink &sink) {
+ if (/* there is still data */) {
+ std::vector<char> data;
+ // prepare data...
+ sink.write(data.data(), data.size());
+ } else {
+ sink.done(); // No more data
+ }
+ return true; // return 'false' if you want to cancel the process.
+ });
});
```
@@ -350,13 +354,15 @@
```cpp
svr.Get("/chunked", [&](const Request& req, Response& res) {
res.set_chunked_content_provider(
- "text/plain", [](size_t offset, DataSink &sink) {
- sink.write("123", 3);
- sink.write("345", 3);
- sink.write("789", 3);
- sink.done(); // No more data
- return true; // return 'false' if you want to cancel the process.
- });
+ "text/plain",
+ [](size_t offset, DataSink &sink) {
+ sink.write("123", 3);
+ sink.write("345", 3);
+ sink.write("789", 3);
+ sink.done(); // No more data
+ return true; // return 'false' if you want to cancel the process.
+ }
+ );
});
```
@@ -365,21 +371,24 @@
```cpp
svr.Get("/chunked", [&](const Request& req, Response& res) {
res.set_header("Trailer", "Dummy1, Dummy2");
- res.set_chunked_content_provider("text/plain", [](size_t offset,
- DataSink &sink) {
- sink.write("123", 3);
- sink.write("345", 3);
- sink.write("789", 3);
- sink.done_with_trailer({{"Dummy1", "DummyVal1"}, {"Dummy2", "DummyVal2"}});
- return true;
- });
+ res.set_chunked_content_provider(
+ "text/plain",
+ [](size_t offset, DataSink &sink) {
+ sink.write("123", 3);
+ sink.write("345", 3);
+ sink.write("789", 3);
+ sink.done_with_trailer({
+ {"Dummy1", "DummyVal1"},
+ {"Dummy2", "DummyVal2"}
+ });
+ return true;
+ }
+ );
});
```
### Send file content
-We can set a file path for the response body. It's a user's responsibility to pass a valid regular file path. If the path doesn't exist, or a directory path, cpp-httplib throws an exception.
-
```cpp
svr.Get("/content", [&](const Request &req, Response &res) {
res.set_file_content("./path/to/conent.html");
@@ -443,8 +452,7 @@
If you want to set the thread count at runtime, there is no convenient way... But here is how.
```cpp
-svr.new_task_queue = [] {
- return new ThreadPool(12); };
+svr.new_task_queue = [] { return new ThreadPool(12); };
```
You can also provide an optional parameter to limit the maximum number
@@ -452,8 +460,7 @@
still waiting to be serviced by worker threads.
```cpp
-svr.new_task_queue = [] {
- return new ThreadPool(/*num_threads=*/12, /*max_queued_requests=*/18); };
+svr.new_task_queue = [] { return new ThreadPool(/*num_threads=*/12, /*max_queued_requests=*/18); };
```
Default limit is 0 (unlimited). Once the limit is reached, the listener
@@ -466,7 +473,9 @@
```cpp
class YourThreadPoolTaskQueue : public TaskQueue {
public:
- YourThreadPoolTaskQueue(size_t n) { pool_.start_with_thread_count(n); }
+ YourThreadPoolTaskQueue(size_t n) {
+ pool_.start_with_thread_count(n);
+ }
virtual bool enqueue(std::function<void()> fn) override {
/* Return true if the task was actually enqueued, or false
@@ -474,7 +483,9 @@
return pool_.enqueue(fn);
}
- virtual void shutdown() override { pool_.shutdown_gracefully(); }
+ virtual void shutdown() override {
+ pool_.shutdown_gracefully();
+ }
private:
YourThreadPool pool_;
@@ -637,8 +648,8 @@
auto res = cli.Get("/large-data",
[&](const char *data, size_t data_length) {
- body.append(data, data_length);
- return true;
+ body.append(data, data_length);
+ return true;
});
```
@@ -648,12 +659,12 @@
auto res = cli.Get(
"/stream", Headers(),
[&](const Response &response) {
- EXPECT_EQ(StatusCode::OK_200, response.status);
- return true; // return 'false' if you want to cancel the request.
+ EXPECT_EQ(StatusCode::OK_200, response.status);
+ return true; // return 'false' if you want to cancel the request.
},
[&](const char *data, size_t data_length) {
- body.append(data, data_length);
- return true; // return 'false' if you want to cancel the request.
+ body.append(data, data_length);
+ return true; // return 'false' if you want to cancel the request.
});
```
@@ -665,8 +676,8 @@
auto res = cli.Post(
"/stream", body.size(),
[](size_t offset, size_t length, DataSink &sink) {
- sink.write(body.data() + offset, length);
- return true; // return 'false' if you want to cancel the request.
+ sink.write(body.data() + offset, length);
+ return true; // return 'false' if you want to cancel the request.
},
"text/plain");
```
@@ -677,11 +688,11 @@
auto res = cli.Post(
"/stream",
[](size_t offset, DataSink &sink) {
- sink.os << "chunked data 1";
- sink.os << "chunked data 2";
- sink.os << "chunked data 3";
- sink.done();
- return true; // return 'false' if you want to cancel the request.
+ sink.os << "chunked data 1";
+ sink.os << "chunked data 2";
+ sink.os << "chunked data 3";
+ sink.done();
+ return true; // return 'false' if you want to cancel the request.
},
"text/plain");
```
@@ -693,8 +704,9 @@
// prints: 0 / 000 bytes => 50% complete
auto res = cli.Get("/", [](uint64_t len, uint64_t total) {
- printf("%lld / %lld bytes => %d%% complete\n", len, total,
- (int)(len * 100 / total));
+ printf("%lld / %lld bytes => %d%% complete\n",
+ len, total,
+ (int)(len*100/total));
return true; // return 'false' if you want to cancel the request.
}
);
@@ -892,8 +904,8 @@
Include `httplib.h` before `Windows.h` or include `Windows.h` by defining `WIN32_LEAN_AND_MEAN` beforehand.
```cpp
-#include <Windows.h>
#include <httplib.h>
+#include <Windows.h>
```
```cpp
diff --git a/httplib.h b/httplib.h
index 28c5100..40bcb8b 100644
--- a/httplib.h
+++ b/httplib.h
@@ -5752,21 +5752,12 @@
inline void Response::set_file_content(const std::string &path,
const std::string &content_type) {
- detail::FileStat stat(dir);
- if (stat.is_file(path)) {
- file_content_path_ = path;
- file_content_content_type_ = content_type;
- return;
- }
-
-#ifndef CPPHTTPLIB_NO_EXCEPTIONS
- std::string msg = "'" + path + "' is not a regular file.";
- throw std::invalid_argument(msg);
-#endif
+ file_content_path_ = path;
+ file_content_content_type_ = content_type;
}
inline void Response::set_file_content(const std::string &path) {
- return set_file_content(path, std::string());
+ file_content_path_ = path;
}
// Result implementation
diff --git a/test/test.cc b/test/test.cc
index 96765e4..b9bc977 100644
--- a/test/test.cc
+++ b/test/test.cc
@@ -2288,8 +2288,6 @@
{
#ifdef CPPHTTPLIB_OPENSSL_SUPPORT
cli_.enable_server_certificate_verification(false);
-#else
-#error no ssl
#endif
}