Mercurial > thymian
diff server/file_sender.cpp @ 0:a4671277546c tip
created the repository for the thymian project
| author | ferencd |
|---|---|
| date | Tue, 17 Aug 2021 11:19:54 +0200 |
| parents | |
| children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/server/file_sender.cpp Tue Aug 17 11:19:54 2021 +0200 @@ -0,0 +1,71 @@ +#include "file_sender.h" +#include <templater.h> +#include <log.h> +#include <unistd.h> +#include <fstream> +#include <boost/algorithm/string.hpp> + +file_sender::file_sender(tnt::HttpRequest& request, tnt::HttpReply& reply, const std::string& file) + : web_component(request, reply, ""), mfile(file) +{} + +file_sender &file_sender::templatize() +{ + mneeds_templates = true; + return *this; +} + +static std::string fn = ""; + +unsigned file_sender::send() +{ + + char cCurrentPath[FILENAME_MAX] = {0}; + + if (!getcwd(cCurrentPath, sizeof(cCurrentPath))) + { + return internalServerError(); + } + + std::string filename(cCurrentPath); + if(mfile[0] != '/' && filename[filename.length() - 1] != '/') + { + filename += '/'; + } + filename += mfile; + + std::ifstream fin(filename.c_str(), std::ios::in | std::ios::binary); + + if(fin) + { + if(mneeds_templates) + { + //TODO mutex! + fn = filename; + GENERIC_FILE_TEMPLATE(FileSender, fn); + std::string res = templater<FileSender>().templatize().get(); + mreply.out() << res; + } + else + { + mreply.setContentType(mimeDb.getMimetype(mfile)); + std::ostringstream oss; + oss << fin.rdbuf(); + std::string fileData(oss.str()); + mreply.out() << fileData; // send the file + } + + return HTTP_OK; + } + else + { + if(boost::starts_with(mfile, theme_path)) + { + return HTTP_NOT_FOUND; + } + + // see if the file is actually from the current theme + unsigned current_theme_file_send = file_sender(mrequest, mreply, theme_path + mfile).send(); + return current_theme_file_send; + } +}
