소스 검색

Update Docker support

yhirose 1 년 전
부모
커밋
ba638ff38e
4개의 변경된 파일66개의 추가작업 그리고 20개의 파일을 삭제
  1. 5 4
      Dockerfile
  2. 7 0
      docker-compose.yml
  3. 0 0
      docker/html/index.html
  4. 54 16
      docker/main.cc

+ 5 - 4
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"]

+ 7 - 0
docker-compose.yml

@@ -0,0 +1,7 @@
+services:
+  http:
+    build: .
+    ports:
+      - "8080:80"
+    volumes:
+      - ./docker/html:/html

+ 0 - 0
docker/index.html → docker/html/index.html


+ 54 - 16
docker/main.cc

@@ -5,35 +5,73 @@
 //  MIT License
 //
 
-#include <cstdio>
-#include <httplib.h>
+#include <chrono>
+#include <ctime>
+#include <format>
+#include <iomanip>
 #include <iostream>
+#include <sstream>
 
-using namespace httplib;
-using namespace std;
+#include <httplib.h>
 
-auto error_html = R"(<html>
-<head><title>%d %s</title></head>
+constexpr auto error_html = R"(<html>
+<head><title>{} {}</title></head>
 <body>
 <center><h1>404 Not Found</h1></center>
-<hr><center>cpp-httplib/%s</center>
+<hr><center>cpp-httplib/{}</center>
 </body>
 </html>
 )";
 
+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;
 }