From ba638ff38e4a3374a92e4921d09da1d2d9f8c0c5 Mon Sep 17 00:00:00 2001 From: yhirose Date: Sat, 31 Aug 2024 17:09:20 -0400 Subject: [PATCH] Update Docker support --- Dockerfile | 9 ++--- docker-compose.yml | 7 ++++ docker/{ => html}/index.html | 0 docker/main.cc | 70 +++++++++++++++++++++++++++--------- 4 files changed, 66 insertions(+), 20 deletions(-) create mode 100644 docker-compose.yml rename docker/{ => html}/index.html (100%) diff --git a/Dockerfile b/Dockerfile index ec8259687d..1c63941dd7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,11 +1,12 @@ FROM ubuntu AS builder -WORKDIR /app +WORKDIR /build COPY httplib.h . COPY docker/main.cc . RUN apt update && apt install g++ -y -RUN g++ -std=c++14 -static -o server -O3 -I. -DCPPHTTPLIB_USE_POLL main.cc +RUN g++ -std=c++23 -static -o server -O2 -I. -DCPPHTTPLIB_USE_POLL main.cc && strip server FROM scratch -COPY --from=builder /app/server /server -COPY docker/index.html /html/index.html +COPY --from=builder /build/server /server +COPY docker/html/index.html /html/index.html +EXPOSE 80 CMD ["/server"] diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000000..4a55b0dc4e --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,7 @@ +services: + http: + build: . + ports: + - "8080:80" + volumes: + - ./docker/html:/html diff --git a/docker/index.html b/docker/html/index.html similarity index 100% rename from docker/index.html rename to docker/html/index.html diff --git a/docker/main.cc b/docker/main.cc index 1f65cb6e7e..8c4968125d 100644 --- a/docker/main.cc +++ b/docker/main.cc @@ -5,35 +5,73 @@ // MIT License // -#include -#include +#include +#include +#include +#include #include +#include -using namespace httplib; -using namespace std; +#include -auto error_html = R"( -%d %s +constexpr auto error_html = R"( +{} {}

404 Not Found

-
cpp-httplib/%s
+
cpp-httplib/{}
)"; +std::string time_local() { + auto p = std::chrono::system_clock::now(); + auto t = std::chrono::system_clock::to_time_t(p); + + std::stringstream ss; + ss << std::put_time(std::localtime(&t), "%d/%b/%Y:%H:%M:%S %z"); + return ss.str(); +} + +std::string log(auto &req, auto &res) { + auto remote_user = "-"; // TODO: + auto request = std::format("{} {} {}", req.method, req.path, req.version); + auto body_bytes_sent = res.get_header_value("Content-Length"); + auto http_referer = "-"; // TODO: + auto http_user_agent = req.get_header_value("User-Agent", "-"); + + // NOTE: From NGINX defualt access log format + // log_format combined '$remote_addr - $remote_user [$time_local] ' + // '"$request" $status $body_bytes_sent ' + // '"$http_referer" "$http_user_agent"'; + return std::format(R"({} - {} [{}] "{}" {} {} "{}" "{}")", req.remote_addr, + remote_user, time_local(), request, res.status, + body_bytes_sent, http_referer, http_user_agent); +} + int main(int argc, const char **argv) { - Server svr; + auto base_dir = "./html"; + auto host = "0.0.0.0"; + auto port = 80; + + httplib::Server svr; - svr.set_error_handler([](const Request & /*req*/, Response &res) { - char buf[BUFSIZ]; - snprintf(buf, sizeof(buf), error_html, res.status, - status_message(res.status), CPPHTTPLIB_VERSION); - res.set_content(buf, "text/html"); + svr.set_error_handler([](auto & /*req*/, auto &res) { + auto body = + std::format(error_html, res.status, httplib::status_message(res.status), + CPPHTTPLIB_VERSION); + + res.set_content(body, "text/html"); }); - svr.set_mount_point("/", "./html"); + svr.set_logger( + [](auto &req, auto &res) { std::cout << log(req, res) << std::endl; }); + + svr.set_mount_point("/", base_dir); + + std::cout << std::format("Serving HTTP on {0} port {1} ...", host, port) + << std::endl; - svr.listen("0.0.0.0", 80); + auto ret = svr.listen(host, port); - return 0; + return ret ? 0 : 1; }