Created
May 6, 2015 23:53
-
-
Save aleks-f/eb7febe771b400dda1e5 to your computer and use it in GitHub Desktop.
Demonstration of color logging in the Poco sample Time HTTP server
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include "Poco/Net/HTTPServer.h" | |
#include "Poco/Net/HTTPRequestHandler.h" | |
#include "Poco/Net/HTTPRequestHandlerFactory.h" | |
#include "Poco/Net/HTTPServerParams.h" | |
#include "Poco/Net/HTTPServerRequest.h" | |
#include "Poco/Net/HTTPServerResponse.h" | |
#include "Poco/Net/HTTPServerParams.h" | |
#include "Poco/Net/ServerSocket.h" | |
#include "Poco/Timestamp.h" | |
#include "Poco/DateTimeFormatter.h" | |
#include "Poco/DateTimeFormat.h" | |
#include "Poco/Exception.h" | |
#include "Poco/ThreadPool.h" | |
#include "Poco/Util/ServerApplication.h" | |
#include "Poco/Util/Option.h" | |
#include "Poco/Util/OptionSet.h" | |
#include "Poco/Util/HelpFormatter.h" | |
#include <Poco/WindowsConsoleChannel.h> | |
#include <iostream> | |
using Poco::Net::ServerSocket; | |
using Poco::Net::HTTPRequestHandler; | |
using Poco::Net::HTTPRequestHandlerFactory; | |
using Poco::Net::HTTPServer; | |
using Poco::Net::HTTPServerRequest; | |
using Poco::Net::HTTPServerResponse; | |
using Poco::Net::HTTPServerParams; | |
using Poco::Timestamp; | |
using Poco::DateTimeFormatter; | |
using Poco::DateTimeFormat; | |
using Poco::ThreadPool; | |
using Poco::Util::ServerApplication; | |
using Poco::Util::Application; | |
using Poco::Util::Option; | |
using Poco::Util::OptionSet; | |
using Poco::Util::HelpFormatter; | |
class TimeRequestHandler: public HTTPRequestHandler | |
/// Return a HTML document with the current date and time. | |
{ | |
public: | |
TimeRequestHandler(const std::string& format): | |
_format(format) | |
{ | |
} | |
void handleRequest(HTTPServerRequest& request, HTTPServerResponse& response) | |
{ | |
Application& app = Application::instance(); | |
Poco::Logger& logger = Poco::Logger::get("something"); | |
logger.error("colors present"); | |
logger.information("Request from " + request.clientAddress().toString()); | |
Timestamp now; | |
std::string dt(DateTimeFormatter::format(now, _format)); | |
response.setChunkedTransferEncoding(true); | |
response.setContentType("text/html"); | |
std::ostream& ostr = response.send(); | |
ostr << "<html><head><title>HTTPTimeServer powered by POCO C++ Libraries</title>"; | |
ostr << "<meta http-equiv=\"refresh\" content=\"1\"></head>"; | |
ostr << "<body><p style=\"text-align: center; font-size: 48px;\">"; | |
ostr << dt; | |
ostr << "</p></body></html>"; | |
} | |
private: | |
std::string _format; | |
}; | |
class TimeRequestHandlerFactory: public HTTPRequestHandlerFactory | |
{ | |
public: | |
TimeRequestHandlerFactory(const std::string& format): | |
_format(format) | |
{ | |
} | |
HTTPRequestHandler* createRequestHandler(const HTTPServerRequest& request) | |
{ | |
if (request.getURI() == "/") | |
return new TimeRequestHandler(_format); | |
else | |
return 0; | |
} | |
private: | |
std::string _format; | |
}; | |
class HTTPTimeServer: public Poco::Util::ServerApplication | |
/// The main application class. | |
/// | |
/// This class handles command-line arguments and | |
/// configuration files. | |
/// Start the HTTPTimeServer executable with the help | |
/// option (/help on Windows, --help on Unix) for | |
/// the available command line options. | |
/// | |
/// To use the sample configuration file (HTTPTimeServer.properties), | |
/// copy the file to the directory where the HTTPTimeServer executable | |
/// resides. If you start the debug version of the HTTPTimeServer | |
/// (HTTPTimeServerd[.exe]), you must also create a copy of the configuration | |
/// file named HTTPTimeServerd.properties. In the configuration file, you | |
/// can specify the port on which the server is listening (default | |
/// 9980) and the format of the date/time string sent back to the client. | |
/// | |
/// To test the TimeServer you can use any web browser (http://localhost:9980/). | |
{ | |
public: | |
HTTPTimeServer(): _helpRequested(false) | |
{ | |
} | |
~HTTPTimeServer() | |
{ | |
} | |
protected: | |
void initialize(Application& self) | |
{ | |
loadConfiguration(); // load default configuration files, if present | |
ServerApplication::initialize(self); | |
} | |
void uninitialize() | |
{ | |
ServerApplication::uninitialize(); | |
} | |
void defineOptions(OptionSet& options) | |
{ | |
ServerApplication::defineOptions(options); | |
options.addOption( | |
Option("help", "h", "display help information on command line arguments") | |
.required(false) | |
.repeatable(false)); | |
} | |
void handleOption(const std::string& name, const std::string& value) | |
{ | |
ServerApplication::handleOption(name, value); | |
if (name == "help") | |
_helpRequested = true; | |
} | |
void displayHelp() | |
{ | |
HelpFormatter helpFormatter(options()); | |
helpFormatter.setCommand(commandName()); | |
helpFormatter.setUsage("OPTIONS"); | |
helpFormatter.setHeader("A web server that serves the current date and time."); | |
helpFormatter.format(std::cout); | |
} | |
int main(const std::vector<std::string>& args) | |
{ | |
if (_helpRequested) | |
{ | |
displayHelp(); | |
} | |
else | |
{ | |
// get parameters from configuration file | |
unsigned short port = (unsigned short) config().getInt("HTTPTimeServer.port", 9980); | |
std::string format(config().getString("HTTPTimeServer.format", DateTimeFormat::SORTABLE_FORMAT)); | |
int maxQueued = config().getInt("HTTPTimeServer.maxQueued", 100); | |
int maxThreads = config().getInt("HTTPTimeServer.maxThreads", 16); | |
ThreadPool::defaultPool().addCapacity(maxThreads); | |
HTTPServerParams* pParams = new HTTPServerParams; | |
pParams->setMaxQueued(maxQueued); | |
pParams->setMaxThreads(maxThreads); | |
Poco::AutoPtr<Poco::WindowsColorConsoleChannel> consoleChannel(new Poco::WindowsColorConsoleChannel()); | |
Poco::Logger& logger = Poco::Logger::get("something"); | |
logger.setChannel(consoleChannel); | |
logger.setLevel(Poco::Message::PRIO_TRACE); | |
logger.warning("Look, I has colors"); | |
// set-up a server socket | |
ServerSocket svs(port); | |
// set-up a HTTPServer instance | |
HTTPServer srv(new TimeRequestHandlerFactory(format), svs, pParams); | |
// start the HTTPServer | |
srv.start(); | |
// wait for CTRL-C or kill | |
waitForTerminationRequest(); | |
// Stop the HTTPServer | |
srv.stop(); | |
} | |
return Application::EXIT_OK; | |
} | |
private: | |
bool _helpRequested; | |
}; | |
int main(int argc, char** argv) | |
{ | |
HTTPTimeServer app; | |
return app.run(argc, argv); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment