Inject logger instead of using a singleton

This commit is contained in:
2019-06-16 11:33:23 +02:00
parent 14740e4a64
commit 9ba225cbde
14 changed files with 76 additions and 56 deletions

View File

@@ -1,32 +1,35 @@
#include <cstdio> #include <cstdio>
#include "logger.hpp" #include "logger.hpp"
void Log(std::string const & label, std::string const & message)
{
std::printf("[%s] %s\n", label.c_str(), message.c_str());
}
void Logger::Success(const std::string & s)
{
Log("SUCCESS", s);
}
void Logger::Error(const std::string & s)
{
Log("ERROR", s);
}
void Logger::Info(const std::string & s)
{
Log("INFO", s);
}
void Logger::Debug(const std::string & s)
{
Log("DEBUG", s);
}
Logger::~Logger() Logger::~Logger()
{ {
} }
Logger::Logger() Logger::Logger()
{ {
}
void Logger::Success(const std::string & s)
{
std::printf("[SUCCESS] %s\n", s.c_str());
}
void Logger::Error(const std::string & s)
{
std::printf("[ERROR] %s\n", s.c_str());
}
void Logger::Info(const std::string & s)
{
std::printf("[INFO] %s\n", s.c_str());
}
Logger & Logger::GetInstance()
{
static Logger logger;
return logger;
} }

View File

@@ -3,17 +3,14 @@
class Logger class Logger
{ {
private:
Logger();
~Logger();
public: public:
void Success(const std::string & s); void Success(const std::string & s);
void Error(const std::string & s); void Error(const std::string & s);
void Info(const std::string & s); void Info(const std::string & s);
void Debug(const std::string & s);
static Logger & GetInstance(); Logger();
~Logger();
Logger(Logger & other) = delete; Logger(Logger & other) = delete;
Logger(Logger && other) = delete; Logger(Logger && other) = delete;
Logger & operator=(Logger & other) = delete; Logger & operator=(Logger & other) = delete;

View File

@@ -5,16 +5,8 @@
int main(int argc, char ** argv) int main(int argc, char ** argv)
{ {
/* Logger logger;
ServerConfiguration & serverConfiguration; HttpServer httpServer(logger);
if (serverConfiguration.LoadFromFile("./server.cfg") && !serverConfiguration.IsValid())
{
Logger::GetInstance().Error("Error loading configuration file, aborting.");
return 1;
}
*/
HttpServer httpServer;
httpServer.Execute(); httpServer.Execute();
return 0; return 0;

9
src/middleware/base.cpp Normal file
View File

@@ -0,0 +1,9 @@
#include "base.hpp"
namespace Middleware
{
BaseMiddleware::BaseMiddleware(Logger & _logger)
: logger(_logger)
{
}
}

View File

@@ -1,6 +1,7 @@
#pragma once #pragma once
#include "../http/request.hpp" #include "../http/request.hpp"
#include "../http/response.hpp" #include "../http/response.hpp"
#include "../logger.hpp"
#include <cstdint> #include <cstdint>
#include <string> #include <string>
@@ -8,10 +9,13 @@ namespace Middleware
{ {
class BaseMiddleware class BaseMiddleware
{ {
protected:
Logger & logger;
public: public:
virtual void HandleRequest(Http::Request const & request, Http::Response & response) = 0; virtual void HandleRequest(Http::Request const & request, Http::Response & response) = 0;
BaseMiddleware() = default; BaseMiddleware(Logger & logger);
virtual ~BaseMiddleware() = default; virtual ~BaseMiddleware() = default;
}; };
} }

View File

@@ -25,4 +25,9 @@ namespace Middleware
responseContent.begin(), responseContent.begin(),
responseContent.end()); responseContent.end());
} }
NotFound::NotFound(Logger & _logger)
: BaseMiddleware(_logger)
{
}
} }

View File

@@ -7,5 +7,7 @@ namespace Middleware
{ {
public: public:
void HandleRequest(Http::Request const & request, Http::Response & Response) override; void HandleRequest(Http::Request const & request, Http::Response & Response) override;
NotFound(Logger & logger);
}; };
} }

View File

@@ -90,11 +90,12 @@ namespace Middleware
return; return;
} }
StaticContent::StaticContent(std::string const & staticFileRoot) StaticContent::StaticContent(Logger & _logger, std::string const & staticFileRoot)
: root(staticFileRoot) : BaseMiddleware(_logger),
root(staticFileRoot)
{ {
std::stringstream ss; std::stringstream ss;
ss << "Using static file root " << root; ss << "Using static file root " << root;
Logger::GetInstance().Info(ss.str()); _logger.Info(ss.str());
} }
} }

View File

@@ -14,6 +14,6 @@ namespace Middleware
public: public:
virtual void HandleRequest(Http::Request const & request, Http::Response & response) override; virtual void HandleRequest(Http::Request const & request, Http::Response & response) override;
StaticContent(std::string const & staticFileRoot); StaticContent(Logger & logger, std::string const & staticFileRoot);
}; };
} }

View File

@@ -15,7 +15,7 @@ void ConnectionOperator::SendResponse(Connection const & connection, Http::Respo
} }
catch(std::runtime_error & e) catch(std::runtime_error & e)
{ {
Logger::GetInstance().Error("Error writing data to connection"); logger.Error("Error writing data to connection");
} }
} }
@@ -34,7 +34,7 @@ void ConnectionOperator::HandleNewConnection(Connection const & newConnection)
ss << "Error during parsing of request <"; ss << "Error during parsing of request <";
ss << e.what(); ss << e.what();
ss << '>'; ss << '>';
Logger::GetInstance().Error(ss.str()); logger.Error(ss.str());
response.code = HttpResponse::Code::BAD_REQUEST; response.code = HttpResponse::Code::BAD_REQUEST;
SendResponse(newConnection, response); SendResponse(newConnection, response);
@@ -54,7 +54,7 @@ void ConnectionOperator::HandleNewConnection(Connection const & newConnection)
ss << " request for file <"; ss << " request for file <";
ss << request.url.GetPath(); ss << request.url.GetPath();
ss << '>'; ss << '>';
Logger::GetInstance().Error(ss.str()); logger.Error(ss.str());
response.code = HttpResponse::Code::NOT_IMPLEMENTED; response.code = HttpResponse::Code::NOT_IMPLEMENTED;
SendResponse(newConnection, response); SendResponse(newConnection, response);
@@ -65,15 +65,16 @@ void ConnectionOperator::HandleNewConnection(Connection const & newConnection)
newConnection.WriteBytes(bytesToSend); newConnection.WriteBytes(bytesToSend);
} }
ConnectionOperator::ConnectionOperator() ConnectionOperator::ConnectionOperator(Logger & _logger)
: logger(_logger)
{ {
// Base static file server // Base static file server
auto const & staticFileRoot = ServerConfiguration::GetInstance().GetWwwRoot(); auto const & staticFileRoot = ServerConfiguration::GetInstance().GetWwwRoot();
if (staticFileRoot.size() > 0) if (staticFileRoot.size() > 0)
{ {
middlewares.emplace_back(std::make_unique<Middleware::StaticContent>(staticFileRoot)); middlewares.emplace_back(std::make_unique<Middleware::StaticContent>(_logger, staticFileRoot));
} }
// ALWAYS LAST! // ALWAYS LAST!
middlewares.emplace_back(std::make_unique<Middleware::NotFound>()); middlewares.emplace_back(std::make_unique<Middleware::NotFound>(_logger));
} }

View File

@@ -1,4 +1,5 @@
#pragma once #pragma once
#include "../logger.hpp"
#include "../middleware/base.hpp" #include "../middleware/base.hpp"
#include "connection.hpp" #include "connection.hpp"
#include <memory> #include <memory>
@@ -8,6 +9,7 @@
class ConnectionOperator class ConnectionOperator
{ {
private: private:
Logger & logger;
std::vector<std::unique_ptr<Middleware::BaseMiddleware>> middlewares; std::vector<std::unique_ptr<Middleware::BaseMiddleware>> middlewares;
void SendResponse(Connection const & connection, Http::Response const & response) const; void SendResponse(Connection const & connection, Http::Response const & response) const;
@@ -15,5 +17,5 @@ private:
public: public:
void HandleNewConnection(Connection const & newConnection); void HandleNewConnection(Connection const & newConnection);
ConnectionOperator(); ConnectionOperator(Logger & logger);
}; };

View File

@@ -1,4 +1,5 @@
#pragma once #pragma once
#include "../logger.hpp"
#include "connection.hpp" #include "connection.hpp"
#include <sys/socket.h> #include <sys/socket.h>
#include <netinet/in.h> #include <netinet/in.h>

View File

@@ -15,17 +15,18 @@ void HttpServer::Execute()
} }
catch (std::runtime_error & e) catch (std::runtime_error & e)
{ {
Logger::GetInstance().Info("Connection dropped on accept"); logger.Info("Connection dropped on accept");
} }
} }
} }
HttpServer::HttpServer() HttpServer::HttpServer(Logger & _logger)
: listeningSocket(ServerConfiguration::GetInstance().GetPort()), : logger(_logger),
connectionOperator(), listeningSocket(ServerConfiguration::GetInstance().GetPort()),
connectionOperator(_logger),
isOpen(true) isOpen(true)
{ {
std::stringstream ss; std::stringstream ss;
ss << "Listening on port " << ServerConfiguration::GetInstance().GetPort(); ss << "Listening on port " << ServerConfiguration::GetInstance().GetPort();
Logger::GetInstance().Info(ss.str()); logger.Info(ss.str());
} }

View File

@@ -1,10 +1,12 @@
#pragma once #pragma once
#include "../logger.hpp"
#include "connectionoperator.hpp" #include "connectionoperator.hpp"
#include "listeningsocket.hpp" #include "listeningsocket.hpp"
class HttpServer class HttpServer
{ {
private: private:
Logger & logger;
ListeningSocket listeningSocket; ListeningSocket listeningSocket;
ConnectionOperator connectionOperator; ConnectionOperator connectionOperator;
bool isOpen; bool isOpen;
@@ -12,7 +14,7 @@ private:
public: public:
void Execute(); void Execute();
HttpServer(); HttpServer(Logger & logger);
HttpServer(HttpServer & other) = delete; HttpServer(HttpServer & other) = delete;
HttpServer & operator=(HttpServer & other) = delete; HttpServer & operator=(HttpServer & other) = delete;
}; };