From 20fdb6e11f632a536f575efc02a9010a2e371cbf Mon Sep 17 00:00:00 2001 From: Roland Reichwein Date: Sun, 19 Feb 2023 16:33:40 +0100 Subject: Fix FCGI result page --- weblog.cpp | 45 +++++++++++++++++++++++++++++++-------------- 1 file changed, 31 insertions(+), 14 deletions(-) (limited to 'weblog.cpp') diff --git a/weblog.cpp b/weblog.cpp index 2005484..68e6490 100644 --- a/weblog.cpp +++ b/weblog.cpp @@ -192,6 +192,24 @@ namespace { return article.substr(0, pos); } + std::string plugin_path(FCGX_Request& request) + { + std::string target{FCGX_GetParam("DOCUMENT_URI", request.envp)}; + while (target.size() > 1 && target.back() == '/') { + target = target.substr(0, target.size() - 1); + } + + std::string rel_target{FCGX_GetParam("PATH_INFO", request.envp)}; + while (rel_target.size() > 1 && rel_target.back() == '/') { + rel_target = rel_target.substr(0, rel_target.size() - 1); + } + + if (target.ends_with(rel_target)) { + return target.substr(0, target.size() - rel_target.size()); + } + return "/"; + } + class HtmlPage { Config& m_config; @@ -203,18 +221,18 @@ namespace { HtmlPage(FCGX_Request& request, Config& config, std::string s = ""s): m_config{config}, - mContents(s), + mContents{s}, mHeader("" "" "" "" + m_config.getName() + "" "" - "" - "" + "" + "" "
"), mFooter("


") + (fs::path{plugin_path(request)} / "impressum.html").generic_string() + + "\">Impressum, Datenschutzerklärung") { } @@ -241,7 +259,7 @@ namespace { HtmlPage htmlPage{request, config, "

"s + config.getName() + "

"s}; - fs::path link{ FCGX_GetParam("PATH_INFO", request.envp)}; + fs::path link{ plugin_path(request) }; auto list{getArticleList(path, page)}; if (list.empty()) @@ -266,6 +284,7 @@ namespace { htmlPage += " older>>"s; htmlPage += "
"; } + FCGX_PutS("Content-Type: text/html\r\n", request.out); FCGX_FPrintF(request.out, "Cache-Control: no-store\r\n\r\n"); std::string data{htmlPage}; FCGX_PutStr(data.c_str(), data.size(), request.out); @@ -295,8 +314,9 @@ namespace { "
" + metaData.at("Date") + "
" "

"s + data + "
□"}; - data = htmlPage; - FCGX_PutStr(data.c_str(), data.size(), request.out); + std::string result {htmlPage}; + FCGX_PutS("Content-Type: text/html\r\n\r\n", request.out); + FCGX_PutStr(result.c_str(), result.size(), request.out); } catch (const std::exception& ex) { return HttpStatus("500", "Reading Article: "s + ex.what(), request); } @@ -379,13 +399,13 @@ void generate_page(FCGX_Request& request, Config& config) std::unordered_map query { SplitQueryString(rel_target) }; // Build the path to the requested file - std::string path_translated{FCGX_GetParam("PATH_TRANSLATED", request.envp)}; + std::string path_translated{config.getDataPath()}; if (rel_target.size() >= 4 && std::all_of(rel_target.begin(), rel_target.begin() + 4, isdigit)) { rel_target = rel_target.substr(0, 4) + "/" + rel_target; } - fs::path path {path_translated}; + fs::path path {fs::path{path_translated} / rel_target}; if (target.size() && target.back() != '/' && fs::is_directory(path)) { - std::string location{FCGX_GetParam("REQUEST_URI", request.envp) + "/"s}; + std::string location{FCGX_GetParam("SCRIPT_NAME", request.envp) + "/"s}; FCGX_FPrintF(request.out, "Location: %s\r\n", location.c_str()); return HttpStatus("301", "Correcting directory path", request); } @@ -401,17 +421,14 @@ void generate_page(FCGX_Request& request, Config& config) } if (is_index_page(rel_target)) { - FCGX_PutS("Content-Type: text/html\r\n", request.out); return generateIndexPage(path, request, config, page); } if (is_article_page(rel_target, path)) { - FCGX_PutS("Content-Type: text/html\r\n", request.out); return generateArticlePage(path, request, config); } if (is_index_file(rel_target, path) || is_article_file(rel_target, path)) { - FCGX_PutS("Content-Type: text/html\r\n", request.out); return generateStaticFile(path, request); } -- cgit v1.2.3