From 253dbecc11b4ced49064be73b3d9125f0ba73eb7 Mon Sep 17 00:00:00 2001 From: nymea Date: Mon, 14 Oct 2019 13:45:07 +0200 Subject: [PATCH] some work on simplehttp server --- httpcommander/devicepluginhttpcommander.cpp | 5 +- httpcommander/httpsimpleserver.cpp | 170 ++------------------ httpcommander/httpsimpleserver.h | 16 +- 3 files changed, 22 insertions(+), 169 deletions(-) diff --git a/httpcommander/devicepluginhttpcommander.cpp b/httpcommander/devicepluginhttpcommander.cpp index c14df5e6..42cc15e4 100644 --- a/httpcommander/devicepluginhttpcommander.cpp +++ b/httpcommander/devicepluginhttpcommander.cpp @@ -72,8 +72,9 @@ void DevicePluginHttpCommander::setupDevice(DeviceSetupInfo *info) if (device->deviceClassId() == httpServerDeviceClassId) { //TODO create a simple server - HttpSimpleServer *httpSimpleServer = new HttpSimpleServer(); - m_httpSimpleServer.insert(device, httpSimpleServer); + HttpSimpleServer *httpSimpleServer = new HttpSimpleServer(device, this); + httpSimpleServer-> + m_httpSimpleServer.insert(httpSimpleServer); return info->finish(Device::DeviceErrorNoError); } info->finish(Device::DeviceErrorNoError); diff --git a/httpcommander/httpsimpleserver.cpp b/httpcommander/httpsimpleserver.cpp index bc889f76..c56562cb 100644 --- a/httpcommander/httpsimpleserver.cpp +++ b/httpcommander/httpsimpleserver.cpp @@ -23,9 +23,6 @@ #include "httpsimpleserver.h" -#include "devices/device.h" -#include "devices/deviceplugin.h" -#include "types/deviceclass.h" #include "types/statetype.h" #include "extern-plugininfo.h" @@ -36,16 +33,9 @@ #include #include -HttpSimpleServer::HttpSimpleServer(Device *device, DevicePlugin *parent): - QTcpServer(parent), - disabled(false), - m_plugin(parent), - m_device(device) +HttpSimpleServer::HttpSimpleServer(QObject *parent): + QTcpServer(parent) { - //QHash portMap; - //portMap.insert(mockDeviceClassId, mockDeviceHttpportParamTypeId); - //portMap.insert(mockDeviceAutoDeviceClassId, mockDeviceAutoDeviceHttpportParamTypeId); - //listen(QHostAddress::Any, device->paramValue(portMap.value(device->deviceClassId())).toInt()); } HttpSimpleServer::~HttpSimpleServer() @@ -55,9 +45,6 @@ HttpSimpleServer::~HttpSimpleServer() void HttpSimpleServer::incomingConnection(qintptr socket) { - if (disabled) - return; - // When a new client connects, the server constructs a QTcpSocket and all // communication with the client is done over this QTcpSocket. QTcpSocket // works asynchronously, this means that all the communication is done @@ -69,173 +56,48 @@ void HttpSimpleServer::incomingConnection(qintptr socket) } -void HttpSimpleServer::actionExecuted(const ActionTypeId &actionTypeId) -{ - m_actionList.append(qMakePair(actionTypeId, QDateTime::currentDateTime())); -} - void HttpSimpleServer::readClient() { - if (disabled) - return; - // This slot is called when the client sent data to the server. The // server looks if it was a get request and sends a very simple HTML // document back. - /*QTcpSocket* socket = (QTcpSocket*)sender(); + QTcpSocket* socket = (QTcpSocket*)sender(); if (socket->canReadLine()) { QByteArray data = socket->readLine(); QStringList tokens = QString(data).split(QRegExp("[ \r\n][ \r\n]*")); QUrl url("http://foo.bar" + tokens[1]); QUrlQuery query(url); - if (url.path() == "/setstate") { - StateTypeId stateTypeId = StateTypeId(query.queryItems().first().first); - QVariant stateValue = query.queryItems().first().second; - if (stateTypeId == mockBoolStateTypeId || stateTypeId == mockBatteryCriticalStateTypeId) { - stateValue.convert(QVariant::Bool); - } else if (stateTypeId == mockIntStateTypeId) { - stateValue.convert(QVariant::Int); - } else if (stateTypeId == mockDoubleStateTypeId) { - stateValue.convert(QVariant::Double); - } - qCDebug(dcHttpCommander) << "Set state value" << stateValue; - emit setState(stateTypeId, stateValue); - } else if (url.path() == "/generateevent") { - emit triggerEvent(EventTypeId(query.queryItemValue("eventtypeid"))); - } else if (url.path() == "/actionhistory") { - qCDebug(dcHttpCommander) << "Get action history called"; - - QTextStream os(socket); - os.setAutoDetectUnicode(true); - os << generateHeader(); - for (int i = 0; i < m_actionList.count(); ++i) { - os << m_actionList.at(i).first.toString() << '\n'; - qCDebug(dcHttpCommander) << " " << m_actionList.at(i).first.toString(); - } - socket->close(); - return; - } else if (url.path() == "/clearactionhistory") { - qCDebug(dcHttpCommander) << "Clear action history"; - m_actionList.clear(); - } else if (url.path() == "/disappear") { - qCDebug(dcHttpCommander) << "Should disappear"; - emit disappear(); - } else if (url.path() == "/reconfigureautodevice") { - qCDebug(dcHttpCommander) << "Reconfigure auto device"; - emit reconfigureAutodevice(); - } if (tokens[0] == "GET") { QTextStream os(socket); os.setAutoDetectUnicode(true); - os << generateWebPage(); + os << generateHeader(); socket->close(); if (socket->state() == QTcpSocket::UnconnectedState) delete socket; + } else if (tokens[0] == "PUT") { + + } else if (tokens[0] == "POST") { + + } else if (tokens[0] == "DELETE") { + } - }*/ + } } void HttpSimpleServer::discardClient() { - QTcpSocket* socket = (QTcpSocket*)sender(); + QTcpSocket* socket = static_cast(sender()); socket->deleteLater(); } QString HttpSimpleServer::generateHeader() { QString contentHeader( - "HTTP/1.0 200 Ok\r\n" - "Content-Type: text/html; charset=\"utf-8\"\r\n" - "\r\n" - ); + "HTTP/1.0 200 Ok\r\n" + "Content-Type: text/html; charset=\"utf-8\"\r\n" + "\r\n" + ); return contentHeader; } - -QString HttpSimpleServer::generateWebPage() -{ - DeviceClass deviceClass; - foreach (const DeviceClass &dc, m_plugin->supportedDevices()) { - if (dc.id() == m_device->deviceClassId()) { - deviceClass = dc; - } - } - Q_ASSERT(deviceClass.isValid()); - - QString body = QString( - "" - "" - "

Mock device Controller

\n" - "
" - "

Device Information

" - "Name: %1
" - "ID: %2
" - "DeviceClass ID: %3
").arg(m_device->name()).arg(m_device->id().toString()).arg(deviceClass.id().toString()); - - body.append("
"); - body.append("

States

"); - - body.append(""); - for (int i = 0; i < deviceClass.stateTypes().count(); ++i) { - body.append(""); - body.append(""); - StateType stateType = deviceClass.stateTypes().at(i); - body.append(""); - body.append(QString("").arg(stateType.id().toString()).arg(m_device->states().at(i).value().toString())); - body.append(""); - body.append(""); - body.append(""); - } - body.append("
" + stateType.name() + "
"); - - body.append("
"); - body.append("

Events

"); - - body.append(""); - for (int i = 0; i < deviceClass.eventTypes().count(); ++i) { - EventType eventType = deviceClass.eventTypes().at(i); - body.append(QString( - "" - "" - "" - "" - "" - "" - ); - } - body.append("
%1").arg(eventType.name()).arg(eventType.id().toString())); - if (!eventType.displayName().endsWith(" changed")) { - body.append(QStringLiteral("")); - } - body.append("
"); - - body.append("
"); - body.append("

Actions

"); - - body.append(""); - body.append(""); - for (int i = 0; i < m_actionList.count(); ++i) { - ActionTypeId actionTypeId = ActionTypeId(m_actionList.at(i).first); - QDateTime timestamp = m_actionList.at(i).second; - QString actionName; - foreach (const ActionType &at, deviceClass.actionTypes()) { - if (at.id() == actionTypeId) { - actionName = at.name(); - break; - } - } - body.append(QString( - "" - "" - "" - "" - "" - ).arg(actionName).arg(actionTypeId.toString()).arg(timestamp.toString())); - } - body.append("
NameType IDTimestamp
%1%2%3
"); - - body.append("\n"); - - return generateHeader() + body; -} diff --git a/httpcommander/httpsimpleserver.h b/httpcommander/httpsimpleserver.h index 1dfe6a46..c3c0b04c 100644 --- a/httpcommander/httpsimpleserver.h +++ b/httpcommander/httpsimpleserver.h @@ -2,6 +2,7 @@ * * * Copyright (C) 2015 Simon Stürz * * Copyright (C) 2014 Michael Zanetti * + * Copyright (C) 2019 Bernhard Trinnes * * * * This file is part of nymea. * * * @@ -37,17 +38,14 @@ class HttpSimpleServer : public QTcpServer { Q_OBJECT public: - HttpSimpleServer(Device *device, DevicePlugin* parent = nullptr); + HttpSimpleServer(QObject* parent = nullptr); ~HttpSimpleServer(); void incomingConnection(qintptr socket) override; - void actionExecuted(const ActionTypeId &actionTypeId); - signals: - void setState(const StateTypeId &stateTypeId, const QVariant &value); - void triggerEvent(const EventTypeId &eventTypeId); void disappear(); void reconfigureAutodevice(); + void getRequestReceied(QUrl url); private slots: void readClient(); @@ -55,15 +53,7 @@ private slots: private: QString generateHeader(); - QString generateWebPage(); -private: - bool disabled; - - DevicePlugin *m_plugin; - Device *m_device; - - QList > m_actionList; }; #endif // HttpSimpleServer_H