Files
WifiLamp/relaiswebserver.cpp
T
2018-04-26 22:46:29 +02:00

178 lines
5.7 KiB
C++

#include "relaiswebserver.h"
#include <QStringBuilder>
#include "httpclientconnection.h"
#include "httpcontainers.h"
#include "relaisserver.h"
#include "relaisclient.h"
RelaisWebserver::RelaisWebserver(RelaisServer *relaisServer, QObject *parent) :
HttpServer(parent),
m_relaisServer(relaisServer)
{
}
void RelaisWebserver::handleRequest(HttpClientConnection *connection, const HttpRequest &request)
{
qDebug() << request.path;
if(!request.path.startsWith('/'))
{
HttpResponse response;
response.protocol = request.protocol;
response.statusCode = HttpResponse::StatusCode::BadRequest;
response.headers.insert(QStringLiteral("Server"), QStringLiteral("Hatschi Server 1.0"));
response.headers.insert(QStringLiteral("Content-Type"), QStringLiteral("text/html"));
connection->sendResponse(response, tr("Path does not start with /"));
return;
}
if(request.path == QStringLiteral("/"))
{
handleRoot(connection, request);
}
else if(request.path.startsWith("/devices/"))
{
auto parts = request.path.split('/');
if(parts.count() != 4)
{
handle404(connection, request);
return;
}
RelaisClient *client = Q_NULLPTR;
for(auto _client : m_relaisServer->clients())
{
if(clientId(_client) == parts.at(2))
{
client = _client;
break;
}
}
if(!client)
{
handle404(connection, request);
return;
}
if(parts.at(3) == "on")
{
client->on();
redirectRoot(connection, request);
return;
}
else if(parts.at(3) == "off")
{
client->off();
redirectRoot(connection, request);
return;
}
else if(parts.at(3) == "toggle")
{
client->toggle();
redirectRoot(connection, request);
return;
}
else if(parts.at(3) == "delete")
{
client->deleteLater();
redirectRoot(connection, request);
return;
}
else if(parts.at(3) == "reboot")
{
client->reboot();
redirectRoot(connection, request);
return;
}
else
{
handle404(connection, request);
return;
}
}
else
{
handle404(connection, request);
}
}
void RelaisWebserver::handleRoot(HttpClientConnection *connection, const HttpRequest &request)
{
QString output = "<p>" % tr("%0 clients").arg(m_relaisServer->clients().count()) % "</p>";
output.append("<table border=\"1\">");
output.append("<thead>");
output.append("<tr>");
output.append("<th>IP-Adress</th>");
output.append("<th>Name</th>");
output.append("<th>Status</th>");
output.append("<th>Actions</th>");
output.append("<th>Administration</th>");
output.append("</tr>");
output.append("</thead>");
output.append("<tbody>");
for(auto client : m_relaisServer->clients())
{
output.append("<tr>");
output.append("<td>" % clientId(client).toHtmlEscaped() % "</td>");
output.append("<td>" % client->name().toHtmlEscaped() % "</td>");
output.append("<td>" % client->status().toHtmlEscaped() % "</td>");
output.append("<td><a href=\"/devices/" % clientId(client).toHtmlEscaped() % "/toggle\">" % tr("toggle") % "</a> ");
if(client->status() != QStringLiteral("on"))
output.append("<a href=\"/devices/" % clientId(client).toHtmlEscaped() % "/on\">" % tr("on") % "</a> ");
if(client->status() != QStringLiteral("off"))
output.append("<a href=\"/devices/" % clientId(client).toHtmlEscaped() % "/off\">" % tr("off") % "</a> ");
output.append("<a href=\"/devices/" % clientId(client).toHtmlEscaped() % "/reboot\">" % tr("reboot") % "</a> ");
output.append("</td>");
output.append("<td><a href=\"/devices/" % clientId(client).toHtmlEscaped() % "/delete\">" % tr("Delete") % "</a></td>");
output.append("</tr>");
}
output.append("</tbody>");
output.append("</table>");
HttpResponse response;
response.protocol = request.protocol;
response.statusCode = HttpResponse::StatusCode::OK;
response.headers.insert(QStringLiteral("Server"), QStringLiteral("Hatschi Server 1.0"));
response.headers.insert(QStringLiteral("Content-Type"), QStringLiteral("text/html"));
connection->sendResponse(response, output);
}
void RelaisWebserver::redirectRoot(HttpClientConnection *connection, const HttpRequest &request)
{
HttpResponse response;
response.protocol = request.protocol;
response.statusCode = HttpResponse::StatusCode::Found;
response.headers.insert(QStringLiteral("Server"), QStringLiteral("Hatschi Server 1.0"));
response.headers.insert(QStringLiteral("Content-Type"), QStringLiteral("text/html"));
response.headers.insert(QStringLiteral("Location"), QStringLiteral("/"));
connection->sendResponse(response, "<a href=\"/\">" % tr("Follow this link") % "</a>");
}
void RelaisWebserver::handle404(HttpClientConnection *connection, const HttpRequest &request)
{
HttpResponse response;
response.protocol = request.protocol;
response.statusCode = HttpResponse::StatusCode::NotFound;
response.headers.insert(QStringLiteral("Server"), QStringLiteral("Hatschi Server 1.0"));
response.headers.insert(QStringLiteral("Content-Type"), QStringLiteral("text/html"));
connection->sendResponse(response, tr("Not Found"));
}
QString RelaisWebserver::clientId(RelaisClient *client)
{
return client->peerAddress().toString() % ':' % QString::number(client->peerPort());
}