Inject logger instead of using a singleton
This commit is contained in:
@@ -1,6 +1,31 @@
|
||||
#include <cstdio>
|
||||
#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()
|
||||
{
|
||||
}
|
||||
@@ -8,25 +33,3 @@ 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;
|
||||
}
|
||||
@@ -3,17 +3,14 @@
|
||||
|
||||
class Logger
|
||||
{
|
||||
private:
|
||||
Logger();
|
||||
~Logger();
|
||||
|
||||
public:
|
||||
void Success(const std::string & s);
|
||||
void Error(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 & operator=(Logger & other) = delete;
|
||||
|
||||
12
src/main.cpp
12
src/main.cpp
@@ -5,16 +5,8 @@
|
||||
|
||||
int main(int argc, char ** argv)
|
||||
{
|
||||
/*
|
||||
ServerConfiguration & serverConfiguration;
|
||||
if (serverConfiguration.LoadFromFile("./server.cfg") && !serverConfiguration.IsValid())
|
||||
{
|
||||
Logger::GetInstance().Error("Error loading configuration file, aborting.");
|
||||
return 1;
|
||||
}
|
||||
*/
|
||||
|
||||
HttpServer httpServer;
|
||||
Logger logger;
|
||||
HttpServer httpServer(logger);
|
||||
httpServer.Execute();
|
||||
|
||||
return 0;
|
||||
|
||||
9
src/middleware/base.cpp
Normal file
9
src/middleware/base.cpp
Normal file
@@ -0,0 +1,9 @@
|
||||
#include "base.hpp"
|
||||
|
||||
namespace Middleware
|
||||
{
|
||||
BaseMiddleware::BaseMiddleware(Logger & _logger)
|
||||
: logger(_logger)
|
||||
{
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
#pragma once
|
||||
#include "../http/request.hpp"
|
||||
#include "../http/response.hpp"
|
||||
#include "../logger.hpp"
|
||||
#include <cstdint>
|
||||
#include <string>
|
||||
|
||||
@@ -8,10 +9,13 @@ namespace Middleware
|
||||
{
|
||||
class BaseMiddleware
|
||||
{
|
||||
protected:
|
||||
Logger & logger;
|
||||
|
||||
public:
|
||||
virtual void HandleRequest(Http::Request const & request, Http::Response & response) = 0;
|
||||
|
||||
BaseMiddleware() = default;
|
||||
BaseMiddleware(Logger & logger);
|
||||
virtual ~BaseMiddleware() = default;
|
||||
};
|
||||
}
|
||||
@@ -25,4 +25,9 @@ namespace Middleware
|
||||
responseContent.begin(),
|
||||
responseContent.end());
|
||||
}
|
||||
|
||||
NotFound::NotFound(Logger & _logger)
|
||||
: BaseMiddleware(_logger)
|
||||
{
|
||||
}
|
||||
}
|
||||
@@ -7,5 +7,7 @@ namespace Middleware
|
||||
{
|
||||
public:
|
||||
void HandleRequest(Http::Request const & request, Http::Response & Response) override;
|
||||
|
||||
NotFound(Logger & logger);
|
||||
};
|
||||
}
|
||||
@@ -90,11 +90,12 @@ namespace Middleware
|
||||
return;
|
||||
}
|
||||
|
||||
StaticContent::StaticContent(std::string const & staticFileRoot)
|
||||
: root(staticFileRoot)
|
||||
StaticContent::StaticContent(Logger & _logger, std::string const & staticFileRoot)
|
||||
: BaseMiddleware(_logger),
|
||||
root(staticFileRoot)
|
||||
{
|
||||
std::stringstream ss;
|
||||
ss << "Using static file root " << root;
|
||||
Logger::GetInstance().Info(ss.str());
|
||||
_logger.Info(ss.str());
|
||||
}
|
||||
}
|
||||
@@ -14,6 +14,6 @@ namespace Middleware
|
||||
public:
|
||||
virtual void HandleRequest(Http::Request const & request, Http::Response & response) override;
|
||||
|
||||
StaticContent(std::string const & staticFileRoot);
|
||||
StaticContent(Logger & logger, std::string const & staticFileRoot);
|
||||
};
|
||||
}
|
||||
@@ -15,7 +15,7 @@ void ConnectionOperator::SendResponse(Connection const & connection, Http::Respo
|
||||
}
|
||||
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 << e.what();
|
||||
ss << '>';
|
||||
Logger::GetInstance().Error(ss.str());
|
||||
logger.Error(ss.str());
|
||||
|
||||
response.code = HttpResponse::Code::BAD_REQUEST;
|
||||
SendResponse(newConnection, response);
|
||||
@@ -54,7 +54,7 @@ void ConnectionOperator::HandleNewConnection(Connection const & newConnection)
|
||||
ss << " request for file <";
|
||||
ss << request.url.GetPath();
|
||||
ss << '>';
|
||||
Logger::GetInstance().Error(ss.str());
|
||||
logger.Error(ss.str());
|
||||
|
||||
response.code = HttpResponse::Code::NOT_IMPLEMENTED;
|
||||
SendResponse(newConnection, response);
|
||||
@@ -65,15 +65,16 @@ void ConnectionOperator::HandleNewConnection(Connection const & newConnection)
|
||||
newConnection.WriteBytes(bytesToSend);
|
||||
}
|
||||
|
||||
ConnectionOperator::ConnectionOperator()
|
||||
ConnectionOperator::ConnectionOperator(Logger & _logger)
|
||||
: logger(_logger)
|
||||
{
|
||||
// Base static file server
|
||||
auto const & staticFileRoot = ServerConfiguration::GetInstance().GetWwwRoot();
|
||||
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!
|
||||
middlewares.emplace_back(std::make_unique<Middleware::NotFound>());
|
||||
middlewares.emplace_back(std::make_unique<Middleware::NotFound>(_logger));
|
||||
}
|
||||
@@ -1,4 +1,5 @@
|
||||
#pragma once
|
||||
#include "../logger.hpp"
|
||||
#include "../middleware/base.hpp"
|
||||
#include "connection.hpp"
|
||||
#include <memory>
|
||||
@@ -8,6 +9,7 @@
|
||||
class ConnectionOperator
|
||||
{
|
||||
private:
|
||||
Logger & logger;
|
||||
std::vector<std::unique_ptr<Middleware::BaseMiddleware>> middlewares;
|
||||
|
||||
void SendResponse(Connection const & connection, Http::Response const & response) const;
|
||||
@@ -15,5 +17,5 @@ private:
|
||||
public:
|
||||
void HandleNewConnection(Connection const & newConnection);
|
||||
|
||||
ConnectionOperator();
|
||||
ConnectionOperator(Logger & logger);
|
||||
};
|
||||
@@ -1,4 +1,5 @@
|
||||
#pragma once
|
||||
#include "../logger.hpp"
|
||||
#include "connection.hpp"
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
|
||||
@@ -15,17 +15,18 @@ void HttpServer::Execute()
|
||||
}
|
||||
catch (std::runtime_error & e)
|
||||
{
|
||||
Logger::GetInstance().Info("Connection dropped on accept");
|
||||
logger.Info("Connection dropped on accept");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
HttpServer::HttpServer()
|
||||
: listeningSocket(ServerConfiguration::GetInstance().GetPort()),
|
||||
connectionOperator(),
|
||||
HttpServer::HttpServer(Logger & _logger)
|
||||
: logger(_logger),
|
||||
listeningSocket(ServerConfiguration::GetInstance().GetPort()),
|
||||
connectionOperator(_logger),
|
||||
isOpen(true)
|
||||
{
|
||||
std::stringstream ss;
|
||||
ss << "Listening on port " << ServerConfiguration::GetInstance().GetPort();
|
||||
Logger::GetInstance().Info(ss.str());
|
||||
logger.Info(ss.str());
|
||||
}
|
||||
@@ -1,10 +1,12 @@
|
||||
#pragma once
|
||||
#include "../logger.hpp"
|
||||
#include "connectionoperator.hpp"
|
||||
#include "listeningsocket.hpp"
|
||||
|
||||
class HttpServer
|
||||
{
|
||||
private:
|
||||
Logger & logger;
|
||||
ListeningSocket listeningSocket;
|
||||
ConnectionOperator connectionOperator;
|
||||
bool isOpen;
|
||||
@@ -12,7 +14,7 @@ private:
|
||||
public:
|
||||
void Execute();
|
||||
|
||||
HttpServer();
|
||||
HttpServer(Logger & logger);
|
||||
HttpServer(HttpServer & other) = delete;
|
||||
HttpServer & operator=(HttpServer & other) = delete;
|
||||
};
|
||||
Reference in New Issue
Block a user