ClickHouse/src/Server/WebUIRequestHandler.cpp

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

74 lines
2.3 KiB
C++
Raw Normal View History

2020-10-20 00:28:33 +00:00
#include "WebUIRequestHandler.h"
#include "IServer.h"
#include <Poco/Net/HTTPServerRequest.h>
#include <Poco/Net/HTTPServerResponse.h>
#include <Poco/Util/LayeredConfiguration.h>
#include <IO/HTTPCommon.h>
2022-08-22 19:55:41 +00:00
#include <re2/re2.h>
2023-07-23 02:56:47 +00:00
#include <incbin.h>
/// Embedded HTML pages
INCBIN(resource_play_html, "play.html");
INCBIN(resource_dashboard_html, "dashboard.html");
INCBIN(resource_uplot_js, "js/uplot.js");
2020-10-20 00:28:33 +00:00
namespace DB
{
2022-08-21 10:11:25 +00:00
WebUIRequestHandler::WebUIRequestHandler(IServer & server_)
: server(server_)
2020-10-20 00:28:33 +00:00
{
}
void WebUIRequestHandler::handleRequest(HTTPServerRequest & request, HTTPServerResponse & response)
2020-10-20 00:28:33 +00:00
{
auto keep_alive_timeout = server.config().getUInt("keep_alive_timeout", 10);
response.setContentType("text/html; charset=UTF-8");
if (request.getVersion() == HTTPServerRequest::HTTP_1_1)
2020-10-20 00:28:33 +00:00
response.setChunkedTransferEncoding(true);
setResponseDefaultHeaders(response, keep_alive_timeout);
2022-08-21 10:11:25 +00:00
if (request.getURI().starts_with("/play"))
{
response.setStatusAndReason(Poco::Net::HTTPResponse::HTTP_OK);
2023-07-23 02:56:47 +00:00
*response.send() << std::string_view(reinterpret_cast<const char *>(gresource_play_htmlData), gresource_play_htmlSize);
2022-08-21 10:11:25 +00:00
}
else if (request.getURI().starts_with("/dashboard"))
{
response.setStatusAndReason(Poco::Net::HTTPResponse::HTTP_OK);
2023-07-23 02:56:47 +00:00
std::string html(reinterpret_cast<const char *>(gresource_dashboard_htmlData), gresource_dashboard_htmlSize);
2022-08-21 10:11:25 +00:00
/// Replace a link to external JavaScript file to embedded file.
/// This allows to open the HTML without running a server and to host it on server.
/// Note: we can embed the JavaScript file inline to the HTML,
/// but we don't do it to keep the "view-source" perfectly readable.
static re2::RE2 uplot_url = R"(https://[^\s"'`]+u[Pp]lot[^\s"'`]*\.js)";
RE2::Replace(&html, uplot_url, "/js/uplot.js");
*response.send() << html;
}
else if (request.getURI() == "/js/uplot.js")
{
response.setStatusAndReason(Poco::Net::HTTPResponse::HTTP_OK);
2023-07-23 02:56:47 +00:00
*response.send() << std::string_view(reinterpret_cast<const char *>(gresource_uplot_jsData), gresource_uplot_jsSize);
2022-08-21 10:11:25 +00:00
}
else
{
response.setStatusAndReason(Poco::Net::HTTPResponse::HTTP_NOT_FOUND);
*response.send() << "Not found.\n";
}
2020-10-20 00:28:33 +00:00
}
}