1
0
Fork 0
mirror of https://github.com/KingDuckZ/kamokan.git synced 2025-07-02 14:04:16 +00:00

Refactoring.

IncRedis is now held by Response, if requested by the base class.
Response objects know their names, and they use it to load
the html (soon to be mustache) data from disk.
Main only prepares a factory, the factory then instantiates
the actual Response.
The code now correctly serves index.cgi when the request is /.
Remove kakoune's safe_ptr from inside src and put an updated
one in lib/kakoune.
This commit is contained in:
King_DuckZ 2017-04-15 03:18:33 +01:00
parent 4bf8dfc29f
commit 680f13e1f6
19 changed files with 400 additions and 195 deletions

View file

@ -16,16 +16,57 @@
*/
#include "response.hpp"
#include "incredis/incredis.hpp"
#include "ini_file.hpp"
#include <utility>
#include <cassert>
#include <fstream>
#include <sstream>
namespace tawashi {
Response::Response (Types parRespType, std::string&& parValue, const boost::string_ref& parBaseURI) :
namespace {
//boost::string_ref fetch_page_basename (const cgi::Env& parEnv) {
// const boost::string_ref& path = parEnv.path_info();
// const std::size_t last_slash = path.rfind('/');
// const std::size_t last_dot = path.rfind('.');
// const std::size_t start_index = (path.npos == last_slash ? 0 : last_slash + 1);
// const std::size_t substr_len = (path.size() - start_index - (last_dot == path.npos ? 0 : path.size() - last_dot));
// assert(start_index <= path.size());
// assert(substr_len < path.size() and substr_len - path.size() - start_index);
// return path.substr(start_index, substr_len);
//}
redis::IncRedis make_incredis (const tawashi::IniFile::KeyValueMapType& parSettings) {
using redis::IncRedis;
if (parSettings.at("redis_mode") == "inet") {
return IncRedis(
std::string(parSettings.at("redis_server")),
dhandy::lexical_cast<uint16_t>(parSettings.at("redis_port"))
);
}
else if (parSettings.at("redis_mode") == "sock") {
return IncRedis(std::string(parSettings.at("redis_sock")));
}
else {
throw std::runtime_error("Unknown setting for \"redis_mode\", valid settings are \"inet\" or \"sock\"");
}
}
} //unnamed namespace
Response::Response (Types parRespType, std::string&& parValue, std::string&& parPageBaseName, const IniFile& parIni, bool parWantRedis) :
m_resp_value(std::move(parValue)),
m_base_uri(parBaseURI),
m_base_uri(parIni.parsed().at("tawashi").at("base_uri")),
//m_page_basename(fetch_page_basename(m_cgi_env)),
m_page_basename(std::move(parPageBaseName)),
m_resp_type(parRespType),
m_header_sent(false)
{
if (parWantRedis) {
m_redis = std::make_unique<redis::IncRedis>(make_incredis(parIni.parsed().at("tawashi")));
m_redis->connect();
}
}
Response::~Response() noexcept = default;
@ -34,6 +75,9 @@ namespace tawashi {
}
void Response::send() {
if (m_redis)
m_redis->wait_for_connect();
this->on_process();
m_header_sent = true;
@ -65,4 +109,27 @@ namespace tawashi {
const boost::string_ref& Response::base_uri() const {
return m_base_uri;
}
const std::string& Response::page_basename() const {
return m_page_basename;
}
std::string Response::load_mustache() const {
std::ostringstream oss;
oss << "html/" << page_basename() << ".html.mstch";
std::cerr << "Trying to load \"" << oss.str() << "\"\n";
std::ifstream if_mstch(oss.str(), std::ios::binary | std::ios::in);
if (!if_mstch)
throw std::runtime_error(std::string("File \"") + oss.str() + "\" not found");
std::ostringstream buffer;
buffer << if_mstch.rdbuf();
return buffer.str();
}
redis::IncRedis& Response::redis() const {
assert(m_redis);
return *m_redis;
}
} //namespace tawashi