1
0
mirror of synced 2025-04-20 11:47:43 +03:00

Changed set_file_content to accept only a regular file path.

This commit is contained in:
yhirose 2024-09-09 19:59:18 -04:00
parent 3f2922b3fa
commit 7ab9c119ef
3 changed files with 90 additions and 91 deletions

View File

@ -119,15 +119,11 @@ int main(void)
if (req.has_header("Content-Length")) { if (req.has_header("Content-Length")) {
auto val = req.get_header_value("Content-Length"); auto val = req.get_header_value("Content-Length");
} }
if (req.has_param("key")) { if (req.has_param("key")) { auto val = req.get_param_value("key"); }
auto val = req.get_param_value("key");
}
res.set_content(req.body, "text/plain"); res.set_content(req.body, "text/plain");
}); });
svr.Get("/stop", [&](const Request& req, Response& res) { svr.Get("/stop", [&](const Request &req, Response &res) { svr.stop(); });
svr.stop();
});
svr.listen("localhost", 1234); svr.listen("localhost", 1234);
} }
@ -354,15 +350,13 @@ svr.Get("/stream", [&](const Request &req, Response &res) {
```cpp ```cpp
svr.Get("/chunked", [&](const Request& req, Response& res) { svr.Get("/chunked", [&](const Request& req, Response& res) {
res.set_chunked_content_provider( res.set_chunked_content_provider(
"text/plain", "text/plain", [](size_t offset, DataSink &sink) {
[](size_t offset, DataSink &sink) {
sink.write("123", 3); sink.write("123", 3);
sink.write("345", 3); sink.write("345", 3);
sink.write("789", 3); sink.write("789", 3);
sink.done(); // No more data sink.done(); // No more data
return true; // return 'false' if you want to cancel the process. return true; // return 'false' if you want to cancel the process.
} });
);
}); });
``` ```
@ -371,24 +365,21 @@ With trailer:
```cpp ```cpp
svr.Get("/chunked", [&](const Request& req, Response& res) { svr.Get("/chunked", [&](const Request& req, Response& res) {
res.set_header("Trailer", "Dummy1, Dummy2"); res.set_header("Trailer", "Dummy1, Dummy2");
res.set_chunked_content_provider( res.set_chunked_content_provider("text/plain", [](size_t offset,
"text/plain", DataSink &sink) {
[](size_t offset, DataSink &sink) {
sink.write("123", 3); sink.write("123", 3);
sink.write("345", 3); sink.write("345", 3);
sink.write("789", 3); sink.write("789", 3);
sink.done_with_trailer({ sink.done_with_trailer({{"Dummy1", "DummyVal1"}, {"Dummy2", "DummyVal2"}});
{"Dummy1", "DummyVal1"},
{"Dummy2", "DummyVal2"}
});
return true; return true;
} });
);
}); });
``` ```
### Send file content ### 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 ```cpp
svr.Get("/content", [&](const Request &req, Response &res) { svr.Get("/content", [&](const Request &req, Response &res) {
res.set_file_content("./path/to/conent.html"); res.set_file_content("./path/to/conent.html");
@ -452,7 +443,8 @@ Please see [Server example](https://github.com/yhirose/cpp-httplib/blob/master/e
If you want to set the thread count at runtime, there is no convenient way... But here is how. If you want to set the thread count at runtime, there is no convenient way... But here is how.
```cpp ```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 You can also provide an optional parameter to limit the maximum number
@ -460,7 +452,8 @@ of pending requests, i.e. requests `accept()`ed by the listener but
still waiting to be serviced by worker threads. still waiting to be serviced by worker threads.
```cpp ```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 Default limit is 0 (unlimited). Once the limit is reached, the listener
@ -473,9 +466,7 @@ You can supply your own thread pool implementation according to your need.
```cpp ```cpp
class YourThreadPoolTaskQueue : public TaskQueue { class YourThreadPoolTaskQueue : public TaskQueue {
public: public:
YourThreadPoolTaskQueue(size_t n) { YourThreadPoolTaskQueue(size_t n) { pool_.start_with_thread_count(n); }
pool_.start_with_thread_count(n);
}
virtual bool enqueue(std::function<void()> fn) override { virtual bool enqueue(std::function<void()> fn) override {
/* Return true if the task was actually enqueued, or false /* Return true if the task was actually enqueued, or false
@ -483,9 +474,7 @@ public:
return pool_.enqueue(fn); return pool_.enqueue(fn);
} }
virtual void shutdown() override { virtual void shutdown() override { pool_.shutdown_gracefully(); }
pool_.shutdown_gracefully();
}
private: private:
YourThreadPool pool_; YourThreadPool pool_;
@ -704,8 +693,7 @@ httplib::Client cli(url, port);
// prints: 0 / 000 bytes => 50% complete // prints: 0 / 000 bytes => 50% complete
auto res = cli.Get("/", [](uint64_t len, uint64_t total) { auto res = cli.Get("/", [](uint64_t len, uint64_t total) {
printf("%lld / %lld bytes => %d%% complete\n", printf("%lld / %lld bytes => %d%% complete\n", len, total,
len, total,
(int)(len * 100 / total)); (int)(len * 100 / total));
return true; // return 'false' if you want to cancel the request. return true; // return 'false' if you want to cancel the request.
} }
@ -904,8 +892,8 @@ g++ 4.8 and below cannot build this library since `<regex>` in the versions are
Include `httplib.h` before `Windows.h` or include `Windows.h` by defining `WIN32_LEAN_AND_MEAN` beforehand. Include `httplib.h` before `Windows.h` or include `Windows.h` by defining `WIN32_LEAN_AND_MEAN` beforehand.
```cpp ```cpp
#include <httplib.h>
#include <Windows.h> #include <Windows.h>
#include <httplib.h>
``` ```
```cpp ```cpp

View File

@ -5752,12 +5752,21 @@ inline void Response::set_chunked_content_provider(
inline void Response::set_file_content(const std::string &path, inline void Response::set_file_content(const std::string &path,
const std::string &content_type) { const std::string &content_type) {
detail::FileStat stat(dir);
if (stat.is_file(path)) {
file_content_path_ = path; file_content_path_ = path;
file_content_content_type_ = content_type; 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
} }
inline void Response::set_file_content(const std::string &path) { inline void Response::set_file_content(const std::string &path) {
file_content_path_ = path; return set_file_content(path, std::string());
} }
// Result implementation // Result implementation

View File

@ -2288,6 +2288,8 @@ protected:
{ {
#ifdef CPPHTTPLIB_OPENSSL_SUPPORT #ifdef CPPHTTPLIB_OPENSSL_SUPPORT
cli_.enable_server_certificate_verification(false); cli_.enable_server_certificate_verification(false);
#else
#error no ssl
#endif #endif
} }