summaryrefslogtreecommitdiff
path: root/rotord/rotord.cpp
blob: ccb770b229fa8ad931448c9fa45755618658468b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include "rotord.h"

RotorRequestHandler::RotorRequestHandler(const std::string& format): _format(format){
}

void RotorRequestHandler::handleRequest(HTTPServerRequest& request,HTTPServerResponse& response) {
        
        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>RotorServer 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>";
}


RotorRequestHandlerFactory::RotorRequestHandlerFactory(const std::string& format):_format(format){
}

HTTPRequestHandler* RotorRequestHandlerFactory::createRequestHandler(const HTTPServerRequest& request){
	Application& app = Application::instance();
	app.logger().information("Request from "+ request.clientAddress().toString()+": "+request.getURI());
	if (request.getURI() == "/")
	    return new RotorRequestHandler(_format);
	else
	    return 0;
}


RotorServer::RotorServer(): _helpRequested(false)
{
}

RotorServer::~RotorServer()
{
}

void RotorServer::initialize(Application& self){
	loadConfiguration();
	ServerApplication::initialize(self);
}

void RotorServer::uninitialize(){
	ServerApplication::uninitialize();
}

void RotorServer::defineOptions(OptionSet& options) {
	ServerApplication::defineOptions(options);
	options.addOption(
		Option("help", "h", "display argument help information")
		    .required(false)
		    .repeatable(false)
		    .callback(OptionCallback<RotorServer>(this, &RotorServer::handleHelp)
		)
	);
}

void RotorServer::handleHelp(const std::string& name, const std::string& value){
	HelpFormatter helpFormatter(options());
	helpFormatter.setCommand(commandName());
	helpFormatter.setUsage("OPTIONS");
	helpFormatter.setHeader(
	    "Rotor");
	helpFormatter.format(std::cout);
	stopOptionsProcessing();
	_helpRequested = true;
}

int RotorServer::main(const std::vector<std::string>& args){
	if (!_helpRequested) {
		unsigned short port = (unsigned short) config().getInt("port", 9980);
		std::string format(config().getString("format", DateTimeFormat::SORTABLE_FORMAT));
		ServerSocket svs(port);
		HTTPServer srv(new RotorRequestHandlerFactory(format), svs, new HTTPServerParams);
		srv.start();
		waitForTerminationRequest();
		srv.stop();
	}
	return Application::EXIT_OK;
}