pixwhile/main.cpp

72 lines
2.4 KiB
C++
Raw Normal View History

2023-04-03 08:57:51 +00:00
#include <cstdio>
#include <httplib/httplib.h>
#include <nlohmann/json.hpp>
#include "config.h"
2023-04-03 15:27:07 +00:00
#include "servehelper.h"
2023-04-03 15:10:08 +00:00
#include "routes/routes.h"
2023-04-03 08:57:51 +00:00
int main(int argc, char** argv) {
if (argc != 2) {
fprintf(stderr, "Usage: %s <path/to/config/file.json>\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;
2023-04-03 09:32:26 +00:00
server.Get("/", [&](const httplib::Request& req, httplib::Response& res) {
home_route(req, res, config);
});
2023-04-03 15:10:08 +00:00
server.Get("/style.css", css_route);
2023-04-03 08:57:51 +00:00
2023-04-03 15:43:40 +00:00
#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
2023-04-03 15:27:07 +00:00
server.Get(".*", [&](const httplib::Request& req, httplib::Response& res) {
res.status = 404;
serve_error(req, res, config, "404: Page not found");
});
2023-04-03 15:43:40 +00:00
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");
}
});
2023-04-03 15:27:07 +00:00
2023-04-03 08:57:51 +00:00
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:<any>\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;
}
}