88 lines
2.3 KiB
C++
88 lines
2.3 KiB
C++
#include "server.hpp"
|
|
#include <iostream>
|
|
#include <signal.h>
|
|
|
|
Server* server = nullptr;
|
|
|
|
void signal_handler(int) {
|
|
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&, 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&, Response& res) {
|
|
res.set_json("{\"status\":\"running\",\"version\":\"1.0\"}");
|
|
});
|
|
|
|
// Users routes
|
|
router.get("/users", [](const Request&, 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&, Response& res) {
|
|
res.set_text("Admin");
|
|
});
|
|
|
|
router.get("/admin/counter", [](const Request&, 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;
|
|
}
|