#include #include #include #include "config.h" #include "servehelper.h" #include "routes/routes.h" int main(int argc, char** argv) { if (argc != 2) { fprintf(stderr, "Usage: %s \n", argc > 0 ? argv[0] : "pixwhile"); return 1; } Config config; try { config = load_config(argv[1]); } catch (const std::exception& e) { fprintf(stderr, "Failed to load config: %s\n", e.what()); return 1; } httplib::Server server; server.Get("/", [&](const httplib::Request& req, httplib::Response& res) { home_route(req, res, config); }); server.Get("/style.css", css_route); #ifndef NDEBUG server.Get("/debug/exception/known", [](const httplib::Request& req, httplib::Response& res) { throw std::runtime_error("awoo"); }); server.Get("/debug/exception/unknown", [](const httplib::Request& req, httplib::Response& res) { throw "cope"; }); #endif server.Get(".*", [&](const httplib::Request& req, httplib::Response& res) { res.status = 404; serve_error(req, res, config, "404: Page not found"); }); server.set_exception_handler([&](const httplib::Request& req, httplib::Response& res, std::exception_ptr ep) { res.status = 500; try { std::rethrow_exception(ep); } catch (const std::exception& e) { serve_error(req, res, config, "500: Internal server error", std::nullopt, e.what()); } catch (...) { serve_error(req, res, config, "500: Internal server error", std::nullopt, "Unknown exception"); } }); if (config.bind_port != 0) { if (!server.bind_to_port(config.bind_host, config.bind_port)) { fprintf(stderr, "Failed to bind to %s:%d\n", config.bind_host.c_str(), config.bind_port); return 1; } } else { int port = server.bind_to_any_port(config.bind_host); if (port == -1) { fprintf(stderr, "Failed to bind to %s:\n", config.bind_host.c_str()); return 1; } config.bind_port = port; } printf("Listening on %s:%d...\n", config.bind_host.c_str(), config.bind_port); if (!server.listen_after_bind()) { fprintf(stderr, "Failed to listen on %s:%d\n", config.bind_host.c_str(), config.bind_port); return 1; } }