Inject logger instead of using a singleton
This commit is contained in:
@@ -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;
|
|
||||||
}
|
}
|
||||||
@@ -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;
|
||||||
|
|||||||
12
src/main.cpp
12
src/main.cpp
@@ -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
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
|
#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;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -25,4 +25,9 @@ namespace Middleware
|
|||||||
responseContent.begin(),
|
responseContent.begin(),
|
||||||
responseContent.end());
|
responseContent.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NotFound::NotFound(Logger & _logger)
|
||||||
|
: BaseMiddleware(_logger)
|
||||||
|
{
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -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);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -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));
|
||||||
}
|
}
|
||||||
@@ -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);
|
||||||
};
|
};
|
||||||
@@ -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>
|
||||||
|
|||||||
@@ -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());
|
||||||
}
|
}
|
||||||
@@ -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;
|
||||||
};
|
};
|
||||||
Reference in New Issue
Block a user