diff --git a/resources/desktop/com.github.rssguard.appdata.xml b/resources/desktop/com.github.rssguard.appdata.xml
index 783add4a9..f300a75ba 100644
--- a/resources/desktop/com.github.rssguard.appdata.xml
+++ b/resources/desktop/com.github.rssguard.appdata.xml
@@ -30,7 +30,7 @@
https://martinrotter.github.io/donate/
-
+
none
diff --git a/src/librssguard/gui/webviewer.cpp b/src/librssguard/gui/webviewer.cpp
index d7bcd3021..f38fedd34 100644
--- a/src/librssguard/gui/webviewer.cpp
+++ b/src/librssguard/gui/webviewer.cpp
@@ -11,6 +11,7 @@
#include "miscellaneous/skinfactory.h"
#include "network-web/adblock/adblockicon.h"
#include "network-web/adblock/adblockmanager.h"
+#include "network-web/networkfactory.h"
#include "network-web/webfactory.h"
#include "network-web/webpage.h"
@@ -151,7 +152,7 @@ void WebViewer::loadMessages(const QList& messages, RootItem* root) {
m_messageBaseUrl = QString();
if (feed != nullptr) {
- QUrl url(feed->source());
+ QUrl url(NetworkFactory::sanitizeUrl(feed->source()));
if (url.isValid()) {
m_messageBaseUrl = url.scheme() + QSL("://") + url.host();
diff --git a/src/librssguard/network-web/downloader.cpp b/src/librssguard/network-web/downloader.cpp
index fd14a510f..498374543 100644
--- a/src/librssguard/network-web/downloader.cpp
+++ b/src/librssguard/network-web/downloader.cpp
@@ -5,6 +5,7 @@
#include "miscellaneous/application.h"
#include "miscellaneous/iofactory.h"
#include "network-web/cookiejar.h"
+#include "network-web/networkfactory.h"
#include "network-web/silentnetworkaccessmanager.h"
#include "network-web/webfactory.h"
@@ -60,15 +61,14 @@ void Downloader::manipulateData(const QString& url,
bool protected_contents,
const QString& username,
const QString& password) {
-
- auto cookies = CookieJar::extractCookiesFromUrl(url);
+ QString sanitized_url = NetworkFactory::sanitizeUrl(url);
+ auto cookies = CookieJar::extractCookiesFromUrl(sanitized_url);
if (!cookies.isEmpty()) {
- qApp->web()->cookieJar()->setCookiesFromUrl(cookies, url);
+ qApp->web()->cookieJar()->setCookiesFromUrl(cookies, sanitized_url);
}
QNetworkRequest request;
- QString non_const_url = url;
QHashIterator i(m_customHeaders);
while (i.hasNext()) {
@@ -82,15 +82,7 @@ void Downloader::manipulateData(const QString& url,
// Set url for this request and fire it up.
m_timer->setInterval(timeout);
- if (non_const_url.startsWith(URI_SCHEME_FEED)) {
- qDebugNN << LOGSEC_NETWORK
- << "Replacing URI schemes for"
- << QUOTE_W_SPACE_DOT(non_const_url);
- request.setUrl(non_const_url.replace(QRegularExpression(QString('^') + URI_SCHEME_FEED), QString(URI_SCHEME_HTTP)));
- }
- else {
- request.setUrl(non_const_url);
- }
+ request.setUrl(qApp->web()->processFeedUriScheme(sanitized_url));
m_targetProtected = protected_contents;
m_targetUsername = username;
diff --git a/src/librssguard/network-web/networkfactory.cpp b/src/librssguard/network-web/networkfactory.cpp
index ab49c3f65..34a4a0e3c 100644
--- a/src/librssguard/network-web/networkfactory.cpp
+++ b/src/librssguard/network-web/networkfactory.cpp
@@ -137,6 +137,11 @@ QString NetworkFactory::networkErrorText(QNetworkReply::NetworkError error_code)
}
}
+QString NetworkFactory::sanitizeUrl(const QString& url) {
+ return QString(url).replace(QRegularExpression(QSL("[^\\w\\-.~:\\/?#\\[\\]@!$&'()*+,;=%]")),
+ QString());
+}
+
QNetworkReply::NetworkError NetworkFactory::downloadIcon(const QList>& urls, int timeout,
QIcon& output, const QNetworkProxy& custom_proxy) {
QNetworkReply::NetworkError network_result = QNetworkReply::NetworkError::UnknownNetworkError;
diff --git a/src/librssguard/network-web/networkfactory.h b/src/librssguard/network-web/networkfactory.h
index c2496e7d6..bc007602b 100644
--- a/src/librssguard/network-web/networkfactory.h
+++ b/src/librssguard/network-web/networkfactory.h
@@ -28,6 +28,7 @@ class NetworkFactory {
// Returns human readable text for given network error.
static QString networkErrorText(QNetworkReply::NetworkError error_code);
+ static QString sanitizeUrl(const QString& url);
// Performs SYNCHRONOUS download if favicon for the site,
// given URL belongs to.
diff --git a/src/librssguard/services/standard/feedparser.cpp b/src/librssguard/services/standard/feedparser.cpp
index 8a2559116..487b4d97a 100755
--- a/src/librssguard/services/standard/feedparser.cpp
+++ b/src/librssguard/services/standard/feedparser.cpp
@@ -92,18 +92,16 @@ QString FeedParser::rawXmlChild(const QDomElement& container) const {
auto children = container.childNodes();
for (int i = 0; i < children.size(); i++) {
- QString raw_ch;
-
if (children.at(i).isCDATASection()) {
- raw_ch = children.at(i).toCDATASection().data();
+ raw += children.at(i).toCDATASection().data();
}
else {
+ QString raw_ch;
QTextStream str(&raw_ch);
children.at(i).save(str, 0);
+ raw += qApp->web()->unescapeHtml(raw_ch);
}
-
- raw += qApp->web()->unescapeHtml(raw_ch);
}
return raw;