diff options
author | Toni Uhlig <matzeton@googlemail.com> | 2021-04-27 11:22:45 +0200 |
---|---|---|
committer | Toni Uhlig <matzeton@googlemail.com> | 2021-04-27 11:22:45 +0200 |
commit | dd086a1608b0e3cd5565174225b8197792bad4b9 (patch) | |
tree | bc31b1004aa94a2e978a310dbd04359948aed4d4 /deps/cpp-httplib/example/server.cc | |
parent | 635f65e4a5bd168cb1c42c850260c8cfb685e8d3 (diff) | |
parent | 2811cc9a77c17ac03aac9c1b582040827a76b0d9 (diff) |
Merge commit '2811cc9a77c17ac03aac9c1b582040827a76b0d9' as 'deps/cpp-httplib'
Diffstat (limited to 'deps/cpp-httplib/example/server.cc')
-rw-r--r-- | deps/cpp-httplib/example/server.cc | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/deps/cpp-httplib/example/server.cc b/deps/cpp-httplib/example/server.cc new file mode 100644 index 0000000..1c347f5 --- /dev/null +++ b/deps/cpp-httplib/example/server.cc @@ -0,0 +1,113 @@ +// +// sample.cc +// +// Copyright (c) 2019 Yuji Hirose. All rights reserved. +// MIT License +// + +#include <chrono> +#include <cstdio> +#include <httplib.h> + +#define SERVER_CERT_FILE "./cert.pem" +#define SERVER_PRIVATE_KEY_FILE "./key.pem" + +using namespace httplib; + +std::string dump_headers(const Headers &headers) { + std::string s; + char buf[BUFSIZ]; + + for (auto it = headers.begin(); it != headers.end(); ++it) { + const auto &x = *it; + snprintf(buf, sizeof(buf), "%s: %s\n", x.first.c_str(), x.second.c_str()); + s += buf; + } + + return s; +} + +std::string log(const Request &req, const Response &res) { + std::string s; + char buf[BUFSIZ]; + + s += "================================\n"; + + snprintf(buf, sizeof(buf), "%s %s %s", req.method.c_str(), + req.version.c_str(), req.path.c_str()); + s += buf; + + std::string query; + for (auto it = req.params.begin(); it != req.params.end(); ++it) { + const auto &x = *it; + snprintf(buf, sizeof(buf), "%c%s=%s", + (it == req.params.begin()) ? '?' : '&', x.first.c_str(), + x.second.c_str()); + query += buf; + } + snprintf(buf, sizeof(buf), "%s\n", query.c_str()); + s += buf; + + s += dump_headers(req.headers); + + s += "--------------------------------\n"; + + snprintf(buf, sizeof(buf), "%d %s\n", res.status, res.version.c_str()); + s += buf; + s += dump_headers(res.headers); + s += "\n"; + + if (!res.body.empty()) { s += res.body; } + + s += "\n"; + + return s; +} + +int main(void) { +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + SSLServer svr(SERVER_CERT_FILE, SERVER_PRIVATE_KEY_FILE); +#else + Server svr; +#endif + + if (!svr.is_valid()) { + printf("server has an error...\n"); + return -1; + } + + svr.Get("/", [=](const Request & /*req*/, Response &res) { + res.set_redirect("/hi"); + }); + + svr.Get("/hi", [](const Request & /*req*/, Response &res) { + res.set_content("Hello World!\n", "text/plain"); + }); + + svr.Get("/slow", [](const Request & /*req*/, Response &res) { + std::this_thread::sleep_for(std::chrono::seconds(2)); + res.set_content("Slow...\n", "text/plain"); + }); + + svr.Get("/dump", [](const Request &req, Response &res) { + res.set_content(dump_headers(req.headers), "text/plain"); + }); + + svr.Get("/stop", + [&](const Request & /*req*/, Response & /*res*/) { svr.stop(); }); + + svr.set_error_handler([](const Request & /*req*/, Response &res) { + const char *fmt = "<p>Error Status: <span style='color:red;'>%d</span></p>"; + char buf[BUFSIZ]; + snprintf(buf, sizeof(buf), fmt, res.status); + res.set_content(buf, "text/html"); + }); + + svr.set_logger([](const Request &req, const Response &res) { + printf("%s", log(req, res).c_str()); + }); + + svr.listen("localhost", 8080); + + return 0; +} |