Skip to content

Commit

Permalink
feat(core,registry): unmount HTTP server prefix on docset removal
Browse files Browse the repository at this point in the history
  • Loading branch information
trollixx committed Jan 31, 2020
1 parent d2db375 commit 8eed299
Show file tree
Hide file tree
Showing 4 changed files with 45 additions and 9 deletions.
12 changes: 12 additions & 0 deletions src/libs/core/httplib.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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;
Expand Down
38 changes: 29 additions & 9 deletions src/libs/core/httpserver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
3 changes: 3 additions & 0 deletions src/libs/core/httpserver.h
Original file line number Diff line number Diff line change
Expand Up @@ -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<httplib::Server> m_server;
std::future<bool> m_future;

Expand Down
1 change: 1 addition & 0 deletions src/libs/registry/docsetregistry.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down

0 comments on commit 8eed299

Please sign in to comment.