#include "relaiswebserver.h" #include #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.body = "Path does not start with /"; response.headers.insert(QStringLiteral("Server"), QStringLiteral("Hatschi Server 1.0")); response.headers.insert(QStringLiteral("Content-Type"), QStringLiteral("text/html")); connection->sendResponse(response); 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 { handle404(connection, request); return; } } else { handle404(connection, request); } } void RelaisWebserver::handleRoot(HttpClientConnection *connection, const HttpRequest &request) { QString output = "

" % tr("%0 clients").arg(m_relaisServer->clients().count()) % "

"; output.append(""); output.append(""); output.append(""); output.append(""); output.append(""); output.append(""); output.append(""); output.append(""); output.append(""); output.append(""); output.append(""); for(auto client : m_relaisServer->clients()) { output.append(""); output.append(""); output.append(""); output.append(""); output.append(""); output.append(""); output.append(""); } output.append(""); output.append("
IP-AdressNameStatusActionsAdministration
" % clientId(client).toHtmlEscaped() % "" % client->name().toHtmlEscaped() % "" % client->status().toHtmlEscaped() % "" % tr("toggle") % " "); if(client->status() != QStringLiteral("on")) output.append("" % tr("on") % " "); if(client->status() != QStringLiteral("off")) output.append("" % tr("off") % " "); output.append("" % tr("Delete") % "
"); HttpResponse response; response.protocol = request.protocol; response.statusCode = HttpResponse::StatusCode::OK; response.body = output.toUtf8(); response.headers.insert(QStringLiteral("Server"), QStringLiteral("Hatschi Server 1.0")); response.headers.insert(QStringLiteral("Content-Type"), QStringLiteral("text/html")); connection->sendResponse(response); } void RelaisWebserver::redirectRoot(HttpClientConnection *connection, const HttpRequest &request) { HttpResponse response; response.protocol = request.protocol; response.statusCode = HttpResponse::StatusCode::Found; response.body = QByteArrayLiteral("Follow this link"); 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); } void RelaisWebserver::handle404(HttpClientConnection *connection, const HttpRequest &request) { HttpResponse response; response.protocol = request.protocol; response.statusCode = HttpResponse::StatusCode::NotFound; response.body = "Not Found"; response.headers.insert(QStringLiteral("Server"), QStringLiteral("Hatschi Server 1.0")); response.headers.insert(QStringLiteral("Content-Type"), QStringLiteral("text/html")); connection->sendResponse(response); } QString RelaisWebserver::clientId(RelaisClient *client) { return client->peerAddress().toString() % ':' % QString::number(client->peerPort()); }