make the REST server optional and disabled by default
Also fixes an issue where the REST server would sometimes try to send the reply to the wrong WebServer instance
This commit is contained in:
parent
c14e7f54cd
commit
b2756c9241
@ -114,6 +114,7 @@ NymeaConfiguration::NymeaConfiguration(QObject *parent) :
|
|||||||
insecureConfig.sslEnabled = false;
|
insecureConfig.sslEnabled = false;
|
||||||
insecureConfig.authenticationEnabled = false;
|
insecureConfig.authenticationEnabled = false;
|
||||||
insecureConfig.publicFolder = defaultWebserverPublicFolderPath();
|
insecureConfig.publicFolder = defaultWebserverPublicFolderPath();
|
||||||
|
insecureConfig.restServerEnabled = false;
|
||||||
m_webServerConfigs[insecureConfig.id] = insecureConfig;
|
m_webServerConfigs[insecureConfig.id] = insecureConfig;
|
||||||
storeWebServerConfig(insecureConfig);
|
storeWebServerConfig(insecureConfig);
|
||||||
|
|
||||||
@ -124,6 +125,7 @@ NymeaConfiguration::NymeaConfiguration(QObject *parent) :
|
|||||||
secureConfig.sslEnabled = true;
|
secureConfig.sslEnabled = true;
|
||||||
secureConfig.authenticationEnabled = false;
|
secureConfig.authenticationEnabled = false;
|
||||||
secureConfig.publicFolder = defaultWebserverPublicFolderPath();
|
secureConfig.publicFolder = defaultWebserverPublicFolderPath();
|
||||||
|
secureConfig.restServerEnabled = false;
|
||||||
m_webServerConfigs[secureConfig.id] = secureConfig;
|
m_webServerConfigs[secureConfig.id] = secureConfig;
|
||||||
storeWebServerConfig(secureConfig);
|
storeWebServerConfig(secureConfig);
|
||||||
}
|
}
|
||||||
@ -269,6 +271,7 @@ void NymeaConfiguration::setWebServerConfiguration(const WebServerConfiguration
|
|||||||
settings.beginGroup("WebServer");
|
settings.beginGroup("WebServer");
|
||||||
settings.beginGroup(config.id);
|
settings.beginGroup(config.id);
|
||||||
settings.setValue("publicFolder", config.publicFolder);
|
settings.setValue("publicFolder", config.publicFolder);
|
||||||
|
settings.setValue("restServerEnabled", config.restServerEnabled);
|
||||||
settings.endGroup();
|
settings.endGroup();
|
||||||
settings.endGroup();
|
settings.endGroup();
|
||||||
|
|
||||||
@ -479,6 +482,7 @@ void NymeaConfiguration::storeWebServerConfig(const WebServerConfiguration &conf
|
|||||||
settings.beginGroup("WebServer");
|
settings.beginGroup("WebServer");
|
||||||
settings.beginGroup(config.id);
|
settings.beginGroup(config.id);
|
||||||
settings.setValue("publicFolder", config.publicFolder);
|
settings.setValue("publicFolder", config.publicFolder);
|
||||||
|
settings.setValue("restServerEnabled", config.restServerEnabled);
|
||||||
settings.endGroup();
|
settings.endGroup();
|
||||||
settings.endGroup();
|
settings.endGroup();
|
||||||
}
|
}
|
||||||
@ -495,6 +499,7 @@ WebServerConfiguration NymeaConfiguration::readWebServerConfig(const QString &id
|
|||||||
config.sslEnabled = settings.value("sslEnabled", true).toBool();
|
config.sslEnabled = settings.value("sslEnabled", true).toBool();
|
||||||
config.authenticationEnabled = settings.value("authenticationEnabled", true).toBool();
|
config.authenticationEnabled = settings.value("authenticationEnabled", true).toBool();
|
||||||
config.publicFolder = settings.value("publicFolder").toString();
|
config.publicFolder = settings.value("publicFolder").toString();
|
||||||
|
config.restServerEnabled = settings.value("restServerEnabled", false).toBool();
|
||||||
settings.endGroup();
|
settings.endGroup();
|
||||||
settings.endGroup();
|
settings.endGroup();
|
||||||
return config;
|
return config;
|
||||||
|
|||||||
@ -53,6 +53,7 @@ class WebServerConfiguration: public ServerConfiguration
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
QString publicFolder;
|
QString publicFolder;
|
||||||
|
bool restServerEnabled = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
class NymeaConfiguration : public QObject
|
class NymeaConfiguration : public QObject
|
||||||
|
|||||||
@ -46,8 +46,7 @@ namespace nymeaserver {
|
|||||||
|
|
||||||
/*! Constructs a \l{RestServer} with the given \a sslConfiguration and \a parent. */
|
/*! Constructs a \l{RestServer} with the given \a sslConfiguration and \a parent. */
|
||||||
RestServer::RestServer(const QSslConfiguration &sslConfiguration, QObject *parent) :
|
RestServer::RestServer(const QSslConfiguration &sslConfiguration, QObject *parent) :
|
||||||
QObject(parent),
|
QObject(parent)
|
||||||
m_webserver(0)
|
|
||||||
{
|
{
|
||||||
Q_UNUSED(sslConfiguration)
|
Q_UNUSED(sslConfiguration)
|
||||||
|
|
||||||
@ -61,12 +60,10 @@ RestServer::RestServer(const QSslConfiguration &sslConfiguration, QObject *paren
|
|||||||
*/
|
*/
|
||||||
void RestServer::registerWebserver(WebServer *webServer)
|
void RestServer::registerWebserver(WebServer *webServer)
|
||||||
{
|
{
|
||||||
m_webserver = webServer;
|
connect(webServer, &WebServer::clientConnected, this, &RestServer::clientConnected);
|
||||||
connect(m_webserver, &WebServer::clientConnected, this, &RestServer::clientConnected);
|
connect(webServer, &WebServer::clientDisconnected, this, &RestServer::clientDisconnected);
|
||||||
connect(m_webserver, &WebServer::clientDisconnected, this, &RestServer::clientDisconnected);
|
connect(webServer, &WebServer::httpRequestReady, this, &RestServer::processHttpRequest);
|
||||||
connect(m_webserver, &WebServer::httpRequestReady, this, &RestServer::processHttpRequest);
|
QMetaObject::invokeMethod(webServer, "startServer", Qt::QueuedConnection);
|
||||||
|
|
||||||
QMetaObject::invokeMethod(m_webserver, "startServer", Qt::QueuedConnection);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void RestServer::setup()
|
void RestServer::setup()
|
||||||
@ -89,12 +86,13 @@ void RestServer::setup()
|
|||||||
|
|
||||||
void RestServer::clientConnected(const QUuid &clientId)
|
void RestServer::clientConnected(const QUuid &clientId)
|
||||||
{
|
{
|
||||||
m_clientList.append(clientId);
|
WebServer *webserver = dynamic_cast<WebServer*>(sender());
|
||||||
|
m_clientList.insert(clientId, webserver);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RestServer::clientDisconnected(const QUuid &clientId)
|
void RestServer::clientDisconnected(const QUuid &clientId)
|
||||||
{
|
{
|
||||||
m_clientList.removeAll(clientId);
|
m_clientList.take(clientId);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RestServer::processHttpRequest(const QUuid &clientId, const HttpRequest &request)
|
void RestServer::processHttpRequest(const QUuid &clientId, const HttpRequest &request)
|
||||||
@ -102,11 +100,14 @@ void RestServer::processHttpRequest(const QUuid &clientId, const HttpRequest &re
|
|||||||
QStringList urlTokens = request.url().path().split("/");
|
QStringList urlTokens = request.url().path().split("/");
|
||||||
urlTokens.removeAll(QString());
|
urlTokens.removeAll(QString());
|
||||||
|
|
||||||
|
WebServer *webserver = dynamic_cast<WebServer*>(sender());
|
||||||
|
Q_ASSERT(webserver);
|
||||||
|
|
||||||
// check token count
|
// check token count
|
||||||
if (urlTokens.count() < 3) {
|
if (urlTokens.count() < 3) {
|
||||||
HttpReply *reply = RestResource::createErrorReply(HttpReply::BadRequest);
|
HttpReply *reply = RestResource::createErrorReply(HttpReply::BadRequest);
|
||||||
reply->setClientId(clientId);
|
reply->setClientId(clientId);
|
||||||
m_webserver->sendHttpReply(reply);
|
webserver->sendHttpReply(reply);
|
||||||
reply->deleteLater();
|
reply->deleteLater();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -116,7 +117,7 @@ void RestServer::processHttpRequest(const QUuid &clientId, const HttpRequest &re
|
|||||||
if (!m_resources.contains(resourceName)) {
|
if (!m_resources.contains(resourceName)) {
|
||||||
HttpReply *reply = RestResource::createErrorReply(HttpReply::BadRequest);
|
HttpReply *reply = RestResource::createErrorReply(HttpReply::BadRequest);
|
||||||
reply->setClientId(clientId);
|
reply->setClientId(clientId);
|
||||||
m_webserver->sendHttpReply(reply);
|
webserver->sendHttpReply(reply);
|
||||||
reply->deleteLater();
|
reply->deleteLater();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -125,7 +126,7 @@ void RestServer::processHttpRequest(const QUuid &clientId, const HttpRequest &re
|
|||||||
if (request.method() == HttpRequest::Options && urlTokens.count() == 3) {
|
if (request.method() == HttpRequest::Options && urlTokens.count() == 3) {
|
||||||
HttpReply *reply = RestResource::createCorsSuccessReply();
|
HttpReply *reply = RestResource::createCorsSuccessReply();
|
||||||
reply->setClientId(clientId);
|
reply->setClientId(clientId);
|
||||||
m_webserver->sendHttpReply(reply);
|
webserver->sendHttpReply(reply);
|
||||||
reply->deleteLater();
|
reply->deleteLater();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -141,7 +142,7 @@ void RestServer::processHttpRequest(const QUuid &clientId, const HttpRequest &re
|
|||||||
reply->startWait();
|
reply->startWait();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
m_webserver->sendHttpReply(reply);
|
webserver->sendHttpReply(reply);
|
||||||
reply->deleteLater();
|
reply->deleteLater();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -171,7 +172,8 @@ void RestServer::asyncReplyFinished()
|
|||||||
qCWarning(dcWebServer) << "Client for async reply not longer connected.";
|
qCWarning(dcWebServer) << "Client for async reply not longer connected.";
|
||||||
} else {
|
} else {
|
||||||
reply->setClientId(clientId);
|
reply->setClientId(clientId);
|
||||||
m_webserver->sendHttpReply(reply);
|
WebServer *webserver = m_clientList.value(clientId);
|
||||||
|
webserver->sendHttpReply(reply);
|
||||||
}
|
}
|
||||||
reply->deleteLater();
|
reply->deleteLater();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -48,8 +48,7 @@ public:
|
|||||||
void registerWebserver(WebServer *webServer);
|
void registerWebserver(WebServer *webServer);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
WebServer *m_webserver;
|
QHash<QUuid, WebServer*> m_clientList;
|
||||||
QList<QUuid> m_clientList;
|
|
||||||
QHash<QString, RestResource *> m_resources;
|
QHash<QString, RestResource *> m_resources;
|
||||||
|
|
||||||
QHash<QUuid, HttpReply *> m_asyncReplies;
|
QHash<QUuid, HttpReply *> m_asyncReplies;
|
||||||
|
|||||||
@ -106,9 +106,8 @@ WebServer::WebServer(const WebServerConfiguration &configuration, const QSslConf
|
|||||||
{
|
{
|
||||||
if (QCoreApplication::instance()->organizationName() == "nymea-test") {
|
if (QCoreApplication::instance()->organizationName() == "nymea-test") {
|
||||||
m_configuration.publicFolder = QCoreApplication::applicationDirPath();
|
m_configuration.publicFolder = QCoreApplication::applicationDirPath();
|
||||||
qCWarning(dcWebServer) << "Using public folder" << QDir(m_configuration.publicFolder).canonicalPath();
|
|
||||||
}
|
}
|
||||||
qCDebug(dcWebServer) << "Using public folder" << QDir(m_configuration.publicFolder).canonicalPath();
|
qCDebug(dcWebServer) << "Starting WebServer. Interface:" << m_configuration.address << "Port:" << m_configuration.port << "SSL:" << m_configuration.sslEnabled << "AUTH:" << m_configuration.authenticationEnabled << "Public folder:" << QDir(m_configuration.publicFolder).canonicalPath();
|
||||||
|
|
||||||
m_avahiService = new QtAvahiService(this);
|
m_avahiService = new QtAvahiService(this);
|
||||||
connect(m_avahiService, &QtAvahiService::serviceStateChanged, this, &WebServer::onAvahiServiceStateChanged);
|
connect(m_avahiService, &QtAvahiService::serviceStateChanged, this, &WebServer::onAvahiServiceStateChanged);
|
||||||
@ -351,8 +350,17 @@ void WebServer::readClient()
|
|||||||
|
|
||||||
// Verify API query
|
// Verify API query
|
||||||
if (request.url().path().startsWith("/api/v1")) {
|
if (request.url().path().startsWith("/api/v1")) {
|
||||||
emit httpRequestReady(clientId, request);
|
if (m_configuration.restServerEnabled) {
|
||||||
return;
|
emit httpRequestReady(clientId, request);
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
qCWarning(dcWebServer()) << "The REST server is disabled. You can enable it by adding \'restServerEnabled=true\' in the WebServer section of the nymead.conf file.";
|
||||||
|
HttpReply *reply = RestResource::createErrorReply(HttpReply::NotFound);
|
||||||
|
reply->setClientId(clientId);
|
||||||
|
sendHttpReply(reply);
|
||||||
|
reply->deleteLater();
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check icon call
|
// Check icon call
|
||||||
|
|||||||
Reference in New Issue
Block a user