diff --git a/src/libs/core/httplib.h b/src/libs/core/httplib.h index 2c74f2902..37d1a63d5 100644 --- a/src/libs/core/httplib.h +++ b/src/libs/core/httplib.h @@ -466,6 +466,7 @@ class Server { Server &Options(const char *pattern, Handler handler); bool set_base_dir(const char *dir, const char *mount_point = nullptr); + bool remove_mount_point(const char *mount_point); void set_file_extension_and_mimetype_mapping(const char *ext, const char *mime); void set_file_request_handler(Handler handler); @@ -2899,6 +2900,17 @@ inline bool Server::set_base_dir(const char *dir, const char *mount_point) { return false; } +inline bool Server::remove_mount_point(const char *mount_point) { + for (auto it = base_dirs_.begin(); it != base_dirs_.end(); ++it) { + if (it->first == mount_point) { + base_dirs_.erase(it); + return true; + } + } + return false; +} + + inline void Server::set_file_extension_and_mimetype_mapping(const char *ext, const char *mime) { file_extension_and_mimetype_map_[ext] = mime; diff --git a/src/libs/core/httpserver.cpp b/src/libs/core/httpserver.cpp index d8c1d9432..f6e25bbe7 100644 --- a/src/libs/core/httpserver.cpp +++ b/src/libs/core/httpserver.cpp @@ -76,19 +76,39 @@ QUrl HttpServer::baseUrl() const QUrl HttpServer::mount(const QString &path, const QString &prefix) { - QString safePrefix = prefix.toLower(); // Safe prefix. - safePrefix.replace(QRegularExpression(QStringLiteral("[^a-zA-Z0-9-_]")), QStringLiteral("_")); - safePrefix.prepend(QLatin1Char('/')); - - const bool rc = m_server->set_base_dir(path.toUtf8(), safePrefix.toUtf8()); - if (!rc) { - qCWarning(log, "Failed to mount '%s' to '%s'.", qPrintable(path), qPrintable(safePrefix)); + const QString pfx = sanitizePrefix(prefix); + const bool ok = m_server->set_base_dir(path.toUtf8(), pfx.toUtf8()); + if (!ok) { + qCWarning(log, "Failed to mount '%s' to '%s'.", qPrintable(path), qPrintable(pfx)); return QUrl(); } - qCDebug(log, "Mounted '%s' to '%s'.", qPrintable(path), qPrintable(safePrefix)); + qCDebug(log, "Mounted '%s' to '%s'.", qPrintable(path), qPrintable(pfx)); QUrl mountUrl = m_baseUrl; - mountUrl.setPath(m_baseUrl.path() + safePrefix); + mountUrl.setPath(m_baseUrl.path() + pfx); return mountUrl; } + +bool HttpServer::unmount(const QString &prefix) +{ + const QString pfx = sanitizePrefix(prefix); + const bool ok = m_server->remove_mount_point(pfx.toUtf8()); + if (!ok) { + qCWarning(log, "Failed to unmount '%s' to '%s'.", qPrintable(prefix), qPrintable(pfx)); + } + + qCDebug(log, "Unmounted prefix '%s' ('%s').", qPrintable(prefix), qPrintable(pfx)); + + + return ok; +} + +QString HttpServer::sanitizePrefix(const QString &prefix) +{ + QString pfx = (prefix.startsWith(QLatin1String("/")) ? prefix.right(1) : prefix).toLower(); + pfx.replace(QRegularExpression(QStringLiteral("[^a-zA-Z0-9-_]")), QStringLiteral("_")); + pfx.prepend(QLatin1Char('/')); + + return pfx; +} diff --git a/src/libs/core/httpserver.h b/src/libs/core/httpserver.h index eb3846336..d48337621 100644 --- a/src/libs/core/httpserver.h +++ b/src/libs/core/httpserver.h @@ -47,8 +47,11 @@ class HttpServer : public QObject QUrl baseUrl() const; QUrl mount(const QString &path, const QString &prefix); + bool unmount(const QString &prefix); private: + static QString sanitizePrefix(const QString &prefix); + std::unique_ptr m_server; std::future m_future; diff --git a/src/libs/registry/docsetregistry.cpp b/src/libs/registry/docsetregistry.cpp index c838380fa..a94465915 100644 --- a/src/libs/registry/docsetregistry.cpp +++ b/src/libs/registry/docsetregistry.cpp @@ -166,6 +166,7 @@ void DocsetRegistry::loadDocset(const QString &path) void DocsetRegistry::unloadDocset(const QString &name) { emit docsetAboutToBeUnloaded(name); + Core::Application::instance()->httpServer()->unmount(name); delete m_docsets.take(name); emit docsetUnloaded(name); }