2017-08-09 14:33:07 +00:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include <Poco/Net/HTTPRequestHandlerFactory.h>
|
|
|
|
#include <Poco/Net/HTTPServerRequest.h>
|
|
|
|
#include <Poco/Net/HTTPServerResponse.h>
|
2017-09-01 19:48:43 +00:00
|
|
|
#include <common/logger_useful.h>
|
2017-08-09 14:33:07 +00:00
|
|
|
#include "IServer.h"
|
|
|
|
#include "HTTPHandler.h"
|
|
|
|
#include "InterserverIOHTTPHandler.h"
|
|
|
|
#include "NotFoundHandler.h"
|
|
|
|
#include "PingRequestHandler.h"
|
|
|
|
#include "ReplicasStatusHandler.h"
|
|
|
|
#include "RootRequestHandler.h"
|
|
|
|
|
|
|
|
|
|
|
|
namespace DB
|
|
|
|
{
|
|
|
|
|
|
|
|
template <typename HandlerType>
|
|
|
|
class HTTPRequestHandlerFactory : public Poco::Net::HTTPRequestHandlerFactory
|
|
|
|
{
|
|
|
|
private:
|
|
|
|
IServer & server;
|
|
|
|
Logger * log;
|
|
|
|
std::string name;
|
|
|
|
|
|
|
|
public:
|
|
|
|
HTTPRequestHandlerFactory(IServer & server_, const std::string & name_) : server(server_), log(&Logger::get(name_)), name(name_)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
Poco::Net::HTTPRequestHandler * createRequestHandler(const Poco::Net::HTTPServerRequest & request) override
|
|
|
|
{
|
|
|
|
LOG_TRACE(log,
|
|
|
|
"HTTP Request for " << name << ". "
|
|
|
|
<< "Method: "
|
|
|
|
<< request.getMethod()
|
|
|
|
<< ", Address: "
|
|
|
|
<< request.clientAddress().toString()
|
|
|
|
<< ", User-Agent: "
|
2018-09-14 19:48:51 +00:00
|
|
|
<< (request.has("User-Agent") ? request.get("User-Agent") : "none")
|
|
|
|
<< (request.hasContentLength() ? (", Length: " + std::to_string(request.getContentLength())) : (""))
|
|
|
|
#if !NDEBUG
|
|
|
|
<< ", Content Type: " << request.getContentType()
|
|
|
|
<< ", Transfer Encoding: " << request.getTransferEncoding()
|
|
|
|
#endif
|
|
|
|
);
|
2017-08-09 14:33:07 +00:00
|
|
|
|
|
|
|
const auto & uri = request.getURI();
|
|
|
|
|
|
|
|
if (request.getMethod() == Poco::Net::HTTPRequest::HTTP_GET || request.getMethod() == Poco::Net::HTTPRequest::HTTP_HEAD)
|
|
|
|
{
|
|
|
|
if (uri == "/")
|
|
|
|
return new RootRequestHandler(server);
|
|
|
|
if (uri == "/ping")
|
2017-09-08 11:57:43 +00:00
|
|
|
return new PingRequestHandler(server);
|
2017-08-09 14:33:07 +00:00
|
|
|
else if (startsWith(uri, "/replicas_status"))
|
|
|
|
return new ReplicasStatusHandler(server.context());
|
|
|
|
}
|
|
|
|
|
|
|
|
if (uri.find('?') != std::string::npos || request.getMethod() == Poco::Net::HTTPRequest::HTTP_POST)
|
|
|
|
{
|
|
|
|
return new HandlerType(server);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (request.getMethod() == Poco::Net::HTTPRequest::HTTP_GET || request.getMethod() == Poco::Net::HTTPRequest::HTTP_HEAD
|
|
|
|
|| request.getMethod() == Poco::Net::HTTPRequest::HTTP_POST)
|
|
|
|
{
|
|
|
|
return new NotFoundHandler;
|
|
|
|
}
|
|
|
|
|
|
|
|
return nullptr;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
using HTTPHandlerFactory = HTTPRequestHandlerFactory<HTTPHandler>;
|
|
|
|
using InterserverIOHTTPHandlerFactory = HTTPRequestHandlerFactory<InterserverIOHTTPHandler>;
|
|
|
|
|
|
|
|
}
|