/*
SPDX-FileCopyrightText: 2026 ahouts
SPDX-License-Identifier: GPL-2.0-or-later
*/
#include "slugrewriteengine.h"
#include "slugrewriteinterceptor_debug.h"
#include "slugrewritesettings.h"
SlugRewriteEngine::SlugRewriteEngine(QObject *parent)
: QObject(parent)
{
reloadRules();
}
SlugRewriteEngine::~SlugRewriteEngine() = default;
SlugRewriteEngine *SlugRewriteEngine::self()
{
static SlugRewriteEngine s_self;
return &s_self;
}
void SlugRewriteEngine::reloadRules()
{
const QStringList matchPrefixes = SlugRewriteSettings::self()->matchPrefixes();
const QStringList replacePrefixes = SlugRewriteSettings::self()->replacePrefixes();
if (matchPrefixes.size() != replacePrefixes.size()) {
qCWarning(SLUGREWRITEINTERCEPTOR_LOG) << "Match and replace prefix lists have different sizes, ignoring rules";
mRewriter.reset();
return;
}
std::vector<rust::String> rustMatchPrefixes;
std::vector<rust::String> rustReplacePrefixes;
for (const auto &prefix : matchPrefixes) {
rustMatchPrefixes.emplace_back(prefix.toStdString());
}
for (const auto &prefix : replacePrefixes) {
rustReplacePrefixes.emplace_back(prefix.toStdString());
}
mRewriter = createRewriter(
rust::Slice<const rust::String>(rustMatchPrefixes.data(), rustMatchPrefixes.size()),
rust::Slice<const rust::String>(rustReplacePrefixes.data(), rustReplacePrefixes.size()));
}
bool SlugRewriteEngine::interceptRequest(QWebEngineUrlRequestInfo &info)
{
if (!mRewriter) {
return false;
}
const std::string url = info.requestUrl().toString().toStdString();
const RewriteResult result = (*mRewriter)->rewriteUrl(url);
if (result.matched) {
const QUrl rewrittenUrl = QUrl(QString::fromStdString(std::string(result.rewrittenUrl)));
qCDebug(SLUGREWRITEINTERCEPTOR_LOG) << "Rewriting" << info.requestUrl() << "to" << rewrittenUrl;
info.redirect(rewrittenUrl);
return true;
}
return false;
}
#include "moc_slugrewriteengine.cpp"