From 521eb929358f6bc5d1e6ff9e20efd35a74cb3b56 Mon Sep 17 00:00:00 2001 From: Martin Rotter Date: Fri, 6 May 2022 10:04:06 +0200 Subject: [PATCH] properly resolve all URLs --- resources/desktop/com.github.rssguard.appdata.xml | 2 +- src/librssguard/gui/feedmessageviewer.cpp | 3 ++- .../webviewers/qtextbrowser/textbrowserviewer.cpp | 10 ++++++---- .../webviewers/qtextbrowser/textbrowserviewer.h | 4 ++-- src/librssguard/network-web/downloader.cpp | 15 ++++++++++++++- 5 files changed, 25 insertions(+), 9 deletions(-) diff --git a/resources/desktop/com.github.rssguard.appdata.xml b/resources/desktop/com.github.rssguard.appdata.xml index 362a89cc5..a7417a358 100644 --- a/resources/desktop/com.github.rssguard.appdata.xml +++ b/resources/desktop/com.github.rssguard.appdata.xml @@ -26,7 +26,7 @@ https://github.com/sponsors/martinrotter - + none diff --git a/src/librssguard/gui/feedmessageviewer.cpp b/src/librssguard/gui/feedmessageviewer.cpp index f91c43a72..905103197 100644 --- a/src/librssguard/gui/feedmessageviewer.cpp +++ b/src/librssguard/gui/feedmessageviewer.cpp @@ -281,7 +281,8 @@ void FeedMessageViewer::initialize() { m_toolBarMessages->setFloatable(false); m_toolBarMessages->setMovable(false); m_toolBarMessages->setAllowedAreas(Qt::ToolBarArea::TopToolBarArea); - m_messagesBrowser->clear(); + + // m_messagesBrowser->clear(); // Now refresh visual setup. refreshVisualProperties(); diff --git a/src/librssguard/gui/webviewers/qtextbrowser/textbrowserviewer.cpp b/src/librssguard/gui/webviewers/qtextbrowser/textbrowserviewer.cpp index c1e3d6637..9c56d9be1 100644 --- a/src/librssguard/gui/webviewers/qtextbrowser/textbrowserviewer.cpp +++ b/src/librssguard/gui/webviewers/qtextbrowser/textbrowserviewer.cpp @@ -66,19 +66,21 @@ QVariant TextBrowserViewer::loadOneResource(int type, const QUrl& name) { return {}; } - if (!m_resourcesEnabled || !m_loadedResources.contains(name)) { + auto resolved_name = m_currentUrl.isValid() ? m_currentUrl.resolved(name) : name; + + if (!m_resourcesEnabled || !m_loadedResources.contains(resolved_name)) { // Resources are not enabled. return m_placeholderImage; } // Resources are enabled and we already have the resource. - QByteArray resource_data = m_loadedResources.value(name); + QByteArray resource_data = m_loadedResources.value(resolved_name); if (resource_data.isEmpty()) { return m_placeholderImageError; } else { - return QImage::fromData(m_loadedResources.value(name)); + return QImage::fromData(m_loadedResources.value(resolved_name)); } } @@ -439,7 +441,7 @@ void TextBrowserViewer::setHtml(const QString& html, const QUrl& base_url) { while (i.hasNext()) { QRegularExpressionMatch match = i.next(); - auto captured_url = match.captured(1); + auto captured_url = base_url.isValid() ? base_url.resolved(QUrl(match.captured(1))) : QUrl(match.captured(1)); if (!found_resources.contains(captured_url)) { found_resources.append(captured_url); diff --git a/src/librssguard/gui/webviewers/qtextbrowser/textbrowserviewer.h b/src/librssguard/gui/webviewers/qtextbrowser/textbrowserviewer.h index 8422b6563..84a62b7b7 100644 --- a/src/librssguard/gui/webviewers/qtextbrowser/textbrowserviewer.h +++ b/src/librssguard/gui/webviewers/qtextbrowser/textbrowserviewer.h @@ -90,9 +90,9 @@ class TextBrowserViewer : public QTextBrowser, public WebViewer { private: bool m_resourcesEnabled; - QList m_neededResources; + QList m_neededResources; // All URLs here must be resolved. QScopedPointer m_resourceDownloader; - QMap m_loadedResources; + QMap m_loadedResources; // All URLs here must be resolved. QPixmap m_placeholderImage; QPixmap m_placeholderImageError; diff --git a/src/librssguard/network-web/downloader.cpp b/src/librssguard/network-web/downloader.cpp index 032294bc5..b64924efd 100644 --- a/src/librssguard/network-web/downloader.cpp +++ b/src/librssguard/network-web/downloader.cpp @@ -142,6 +142,12 @@ void Downloader::finished() { m_timer->stop(); + QUrl original_url = reply->property("original_url").toUrl(); + + if (!original_url.isValid()) { + original_url = reply->request().url(); + } + // In this phase, some part of downloading process is completed. QUrl redirection_url = reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl(); @@ -180,6 +186,10 @@ void Downloader::finished() { else if (reply_operation == QNetworkAccessManager::DeleteOperation) { runDeleteRequest(request); } + + if (m_activeReply != nullptr) { + m_activeReply->setProperty("original_url", original_url); + } } else { // No redirection is indicated. Final file is obtained in our "reply" object. @@ -204,6 +214,9 @@ void Downloader::finished() { m_lastContentType = reply->header(QNetworkRequest::ContentTypeHeader); m_lastOutputError = reply->error(); + + // original_url = m_activeReply->property("original_url").toUrl(); + m_activeReply->deleteLater(); m_activeReply = nullptr; @@ -211,7 +224,7 @@ void Downloader::finished() { m_inputMultipartData->deleteLater(); } - emit completed(reply->request().url(), m_lastOutputError, m_lastOutputData); + emit completed(original_url, m_lastOutputError, m_lastOutputData); } }