cpp_server/main.cpp
2025-06-30 12:07:00 -05:00

88 lines
2.4 KiB
C++

#include "server.hpp"
#include <iostream>
#include <signal.h>
Server* server = nullptr;
void signal_handler(int sig) {
if (server) {
std::cout << "\nShutting down server...\n";
server->store.save();
server->sessions.save();
server->stop();
}
}
int main() {
signal(SIGINT, signal_handler);
signal(SIGTERM, signal_handler);
Router router;
// Root route
router.get("/", [](const Request& req, Response& res) {
res.set_text("Hello, World! HTTP Server with Router\n");
res.set_cookie("test_cookie", "hey there!");
});
// API routes
router.get("/api/status", [](const Request& req, Response& res) {
res.set_json("{\"status\":\"running\",\"version\":\"1.0\"}");
});
// Users routes
router.get("/users", [](const Request& req, Response& res) {
res.set_json("{\"users\":[{\"id\":1,\"name\":\"Alice\"},{\"id\":2,\"name\":\"Bob\"}]}");
});
router.get("/users/:id", [](const Request& req, Response& res) {
std::string id = req.get_param("id");
std::string response = "{\"id\":" + id + ",\"name\":\"User" + id + "\"}";
res.set_json(response);
});
router.post("/users", [](const Request& req, Response& res) {
const auto body_preview = std::string(req.body.substr(0, 100));
res.set_json(R"({"message":"User created","received":")" + body_preview + "\"}");
res.status = 201;
});
router.get("/request-info", [](const Request& req, Response& res) {
std::string info = "Method: " + std::to_string(static_cast<int>(req.method)) + "\n";
info += "Path: " + std::string(req.path) + "\n";
info += "Query: " + std::string(req.query) + "\n";
info += "Headers: " + std::to_string(req.headers.size()) + "\n";
info += "Body length: " + std::to_string(req.body.size()) + "\n";
res.set_text(info);
});
router.get("/foo", [](const Request& req, Response& res) {
res.set_text("Admin");
});
router.get("/admin/counter", [](const Request& req, Response& res) {
auto current = server->store.get<int>("visit_count");
int count = current ? current.value() : 0;
server->store.set("visit_count", count + 1);
res.set_text("Counter: " + std::to_string(count + 1));
});
server = new Server(8080, router);
server->serve_static("../assets");
if (!server->start()) {
std::cerr << "Failed to start server\n";
return 1;
}
std::cout << "Server running on http://localhost:8080\n";
std::cout << "Press Ctrl+C to stop\n";
server->run();
delete server;
return 0;
}