From 2264298c41ad2614d2ea936017c6c1b1e8edad60 Mon Sep 17 00:00:00 2001 From: Martin Rotter Date: Fri, 20 Oct 2017 22:31:23 +0200 Subject: [PATCH] Fix #154. --- resources/binaries | 2 +- resources/text/CHANGELOG | 4 +- src/network-web/downloader.cpp | 1 - .../gmail/network/gmailnetworkfactory.cpp | 37 +++++++++++++++---- .../gmail/network/gmailnetworkfactory.h | 3 +- src/services/standard/feedparser.cpp | 3 ++ 6 files changed, 37 insertions(+), 13 deletions(-) diff --git a/resources/binaries b/resources/binaries index 4a01edaec..ae7084718 160000 --- a/resources/binaries +++ b/resources/binaries @@ -1 +1 @@ -Subproject commit 4a01edaec7d67d3b2ae81aeea2a3c876216fbab8 +Subproject commit ae7084718c41afc01919779e58cd449e0eebd401 diff --git a/resources/text/CHANGELOG b/resources/text/CHANGELOG index 25b3aed43..b76be625e 100644 --- a/resources/text/CHANGELOG +++ b/resources/text/CHANGELOG @@ -1,8 +1,8 @@ 3.5.3 ————— -Added: -▪ +Fixed: +▪ Some feed files do not have URLs of messages properly sanitized. Strip "\n" and "\t" from URls. (bug #154) 3.5.1 ————— diff --git a/src/network-web/downloader.cpp b/src/network-web/downloader.cpp index a590e36b3..d59450e55 100755 --- a/src/network-web/downloader.cpp +++ b/src/network-web/downloader.cpp @@ -152,7 +152,6 @@ void Downloader::finished() { } m_lastContentType = reply->header(QNetworkRequest::ContentTypeHeader); - m_lastOutputError = reply->error(); m_activeReply->deleteLater(); m_activeReply = nullptr; diff --git a/src/services/gmail/network/gmailnetworkfactory.cpp b/src/services/gmail/network/gmailnetworkfactory.cpp index 77a56a97a..a0c9c867e 100755 --- a/src/services/gmail/network/gmailnetworkfactory.cpp +++ b/src/services/gmail/network/gmailnetworkfactory.cpp @@ -7,6 +7,7 @@ #include "gui/tabwidget.h" #include "miscellaneous/application.h" #include "miscellaneous/databasequeries.h" +#include "miscellaneous/textfactory.h" #include "network-web/networkfactory.h" #include "network-web/oauth2service.h" #include "network-web/silentnetworkaccessmanager.h" @@ -140,7 +141,7 @@ QList GmailNetworkFactory::messages(const QString& stream_id, Feed::Sta QList more_messages = decodeLiteMessages(messages_data, stream_id, next_page_token); // Now, we via batch HTTP request obtain full data for each message. - bool obtained = obtainAndDecodeFullMessages(more_messages); + bool obtained = obtainAndDecodeFullMessages(more_messages, stream_id); if (obtained) { messages.append(more_messages); @@ -329,7 +330,22 @@ void GmailNetworkFactory::onAuthFailed() { }); } -bool GmailNetworkFactory::obtainAndDecodeFullMessages(QList& lite_messages) { +void GmailNetworkFactory::fillFullMessage(Message& msg, const QJsonObject& json, const QString& feed_id) { + QHash headers; + + foreach (const QJsonValue& header, json["payload"].toObject()["headers"].toArray()) { + headers.insert(header.toObject()["name"].toString(), header.toObject()["value"].toString()); + } + + msg.m_author = headers["From"]; + msg.m_title = headers["Subject"]; + msg.m_createdFromFeed = true; + msg.m_created = TextFactory::parseDateTime(headers["Date"]); + + // TODO: Pokračovat. +} + +bool GmailNetworkFactory::obtainAndDecodeFullMessages(QList& lite_messages, const QString& feed_id) { QHttpMultiPart* multi = new QHttpMultiPart(); multi->setContentType(QHttpMultiPart::ContentType::MixedType); @@ -360,12 +376,14 @@ bool GmailNetworkFactory::obtainAndDecodeFullMessages(QList& lite_messa headers.append(QPair(QString(HTTP_HEADERS_AUTHORIZATION).toLocal8Bit(), bearer.toLocal8Bit())); - if (NetworkFactory::performNetworkOperation(GMAIL_API_BATCH, - timeout, - multi, - output, - QNetworkAccessManager::Operation::PostOperation, - headers).first == QNetworkReply::NetworkError::NoError) { + NetworkResult res = NetworkFactory::performNetworkOperation(GMAIL_API_BATCH, + timeout, + multi, + output, + QNetworkAccessManager::Operation::PostOperation, + headers); + + if (res.first == QNetworkReply::NetworkError::NoError) { // We parse each part of HTTP response (it contains HTTP headers and payload with msg full data). foreach (const HttpResponse& part, output) { QJsonObject msg_doc = QJsonDocument::fromJson(part.body().toUtf8()).object(); @@ -374,8 +392,11 @@ bool GmailNetworkFactory::obtainAndDecodeFullMessages(QList& lite_messa if (msgs.contains(msg_id)) { Message& msg = msgs[msg_id]; + fillFullMessage(msg, msg_doc, feed_id); } } + + return true; } else { return false; diff --git a/src/services/gmail/network/gmailnetworkfactory.h b/src/services/gmail/network/gmailnetworkfactory.h index efa582c1e..8ef54c9ce 100755 --- a/src/services/gmail/network/gmailnetworkfactory.h +++ b/src/services/gmail/network/gmailnetworkfactory.h @@ -47,7 +47,8 @@ class GmailNetworkFactory : public QObject { void onAuthFailed(); private: - bool obtainAndDecodeFullMessages(QList& lite_messages); + void fillFullMessage(Message& msg, const QJsonObject& json, const QString& feed_id); + bool obtainAndDecodeFullMessages(QList& lite_messages, const QString& feed_id); QList decodeLiteMessages(const QString& messages_json_data, const QString& stream_id, QString& next_page_token); //RootItem* decodeFeedCategoriesData(const QString& categories); diff --git a/src/services/standard/feedparser.cpp b/src/services/standard/feedparser.cpp index b8119e52a..9550acf90 100755 --- a/src/services/standard/feedparser.cpp +++ b/src/services/standard/feedparser.cpp @@ -5,6 +5,7 @@ #include "exceptions/applicationexception.h" #include +#include FeedParser::FeedParser(const QString& data) : m_xmlData(data) { m_xml.setContent(m_xmlData, true); @@ -31,6 +32,8 @@ QList FeedParser::messages() { new_message.m_author = feed_author; } + new_message.m_url = new_message.m_url.replace(QRegularExpression("[\\t\\n]"), QString()); + messages.append(new_message); } catch (const ApplicationException& ex) {