From ceae213b0306cc3cd0a2f0d9354a5c5e01d2ff0c Mon Sep 17 00:00:00 2001 From: blue Date: Tue, 11 Apr 2023 20:06:36 -0300 Subject: [PATCH] initial --- CMakeLists.txt | 17 ++++++++++++++++- main.cpp | 47 ++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 60 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2db42aa..ae4cddd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,22 @@ cmake_minimum_required(VERSION 3.0) -project(birdbadge) +project(birdbadge + VERSION 0.0.1 + DESCRIPTION "Bird Badge" + LANGUAGES CXX +) + +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +find_package(PkgConfig REQUIRED) +pkg_check_modules(FCGI fcgi) add_executable(birdbadge main.cpp) +target_link_libraries(birdbadge + fcgi + fcgi++ +) + install(TARGETS birdbadge RUNTIME DESTINATION bin) diff --git a/main.cpp b/main.cpp index 8bb47f1..0bd3047 100644 --- a/main.cpp +++ b/main.cpp @@ -1,6 +1,47 @@ #include +#include +#include +#include -int main(int argc, char **argv) { - std::cout << "Hello, world!" << std::endl; - return 0; +#include + +constexpr static const char* GET("GET"); + +constexpr static const char* REQUEST_METHOD("REQUEST_METHOD"); +constexpr static const char* SCRIPT_NAME("SCRIPT_NAME"); + +constexpr static const char* status405("Status: 405 Method Not Allowed"); +constexpr static const char* contentTypeHtml("Content-type: text/html"); + +constexpr static const char* headerEnd("\n\n"); + +void handleRequest(FCGX_Request& request) { + fcgi_streambuf cin_fcgi_streambuf(request.in); + fcgi_streambuf cout_fcgi_streambuf(request.out); + fcgi_streambuf cerr_fcgi_streambuf(request.err); + std::ostream os{&cout_fcgi_streambuf}; + std::ostream errs{&cerr_fcgi_streambuf}; + std::istream is{&cin_fcgi_streambuf}; + + std::string requestMethod(FCGX_GetParam(REQUEST_METHOD, request.envp)); + if (requestMethod != GET) { + os << status405; + return; + } + + std::string scriptName{FCGX_GetParam(SCRIPT_NAME, request.envp)}; + os << contentTypeHtml; + os << headerEnd; + os << scriptName << "\n"; +} + +int main() { + FCGX_Request request; + + FCGX_Init(); + FCGX_InitRequest(&request, 0, 0); + + while (FCGX_Accept_r(&request) == 0) { + handleRequest(request); + } }