rssguard/src/librssguard/network-web/gemini/geminischemehandler.cpp
2024-12-19 10:41:41 +01:00

89 lines
2.8 KiB
C++

// For license of this file, see <project-root-folder>/LICENSE.md.
#include "network-web/gemini/geminischemehandler.h"
#include "definitions/definitions.h"
#include "miscellaneous/iofactory.h"
#include "network-web/gemini/geminiparser.h"
#include <QBuffer>
GeminiSchemeHandler::GeminiSchemeHandler(QObject* parent) : QWebEngineUrlSchemeHandler(parent) {}
void GeminiSchemeHandler::requestStarted(QWebEngineUrlRequestJob* request) {
GeminiClient* gemini_client = new GeminiClient(this);
m_jobs.insert(request, gemini_client);
connect(gemini_client, &GeminiClient::redirected, this, &GeminiSchemeHandler::onRedirect);
connect(gemini_client, &GeminiClient::requestComplete, this, &GeminiSchemeHandler::onCompleted);
connect(gemini_client, &GeminiClient::networkError, this, &GeminiSchemeHandler::onNetworkError);
connect(request, &QWebEngineUrlRequestJob::destroyed, this, &GeminiSchemeHandler::onJobDeleted);
gemini_client->startRequest(request->requestUrl(), GeminiClient::RequestOptions::IgnoreTlsErrors);
}
void GeminiSchemeHandler::onRedirect(const QUrl& uri, bool is_permanent) {
GeminiClient* gemini_client = qobject_cast<GeminiClient*>(sender());
auto* job = m_jobs.key(gemini_client);
if (job != nullptr) {
job->redirect(uri);
m_jobs.remove(job);
gemini_client->deleteLater();
}
}
void GeminiSchemeHandler::onCompleted(const QByteArray& data, const QString& mime) {
GeminiClient* gemini_client = qobject_cast<GeminiClient*>(sender());
auto* job = m_jobs.key(gemini_client);
if (job != nullptr) {
QBuffer* buf = new QBuffer();
QString target_mime;
buf->open(QBuffer::ReadWrite);
if (mime.startsWith(QSL(GEMINI_MIME_TYPE))) {
// IOFactory::writeFile("a", data);
buf->write(GeminiParser().geminiToHtml(data).toUtf8());
target_mime = QSL("text/html");
}
else {
buf->write(data);
target_mime = mime;
}
buf->seek(0);
connect(job, &QWebEngineUrlRequestJob::destroyed, buf, &QBuffer::deleteLater);
job->reply(target_mime.toLocal8Bit(), buf);
m_jobs.remove(job);
gemini_client->deleteLater();
}
}
void GeminiSchemeHandler::onNetworkError(GeminiClient::NetworkError error, const QString& reason) {
GeminiClient* gemini_client = qobject_cast<GeminiClient*>(sender());
auto* job = m_jobs.key(gemini_client);
if (job != nullptr) {
job->fail(QWebEngineUrlRequestJob::Error::RequestFailed);
m_jobs.remove(job);
gemini_client->deleteLater();
}
}
void GeminiSchemeHandler::onJobDeleted(QObject* job) {
auto* key = qobject_cast<QWebEngineUrlRequestJob*>(job);
auto* gemini_client = m_jobs.value(key);
if (gemini_client != nullptr) {
gemini_client->deleteLater();
}
if (key != nullptr) {
m_jobs.remove(key);
}
}