36 #include <QNetworkCookie>
37 #include <QNetworkCookieJar>
38 #include <QNetworkProxy>
39 #include <QNetworkReply>
40 #include <QNetworkRequest>
53 const char DEFAULT_USER_AGENT[] =
"Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0";
59 : QNetworkCookieJar(parent)
61 const QDateTime now = QDateTime::currentDateTime();
65 if (cookie.isSessionCookie() || (cookie.expirationDate() <= now))
66 cookies.removeAll(cookie);
69 setAllCookies(cookies);
74 const QDateTime now = QDateTime::currentDateTime();
75 QList<QNetworkCookie> cookies = allCookies();
76 for (
const QNetworkCookie &cookie :
asConst(allCookies()))
78 if (cookie.isSessionCookie() || (cookie.expirationDate() <= now))
79 cookies.removeAll(cookie);
85 using QNetworkCookieJar::allCookies;
86 using QNetworkCookieJar::setAllCookies;
90 const QDateTime now = QDateTime::currentDateTime();
91 QList<QNetworkCookie> cookies = QNetworkCookieJar::cookiesForUrl(url);
92 for (
const QNetworkCookie &cookie :
asConst(QNetworkCookieJar::cookiesForUrl(url)))
94 if (!cookie.isSessionCookie() && (cookie.expirationDate() <= now))
95 cookies.removeAll(cookie);
103 const QDateTime now = QDateTime::currentDateTime();
104 QList<QNetworkCookie> cookies = cookieList;
105 for (
const QNetworkCookie &cookie : cookieList)
107 if (!cookie.isSessionCookie() && (cookie.expirationDate() <= now))
108 cookies.removeAll(cookie);
111 return QNetworkCookieJar::setCookiesFromUrl(cookies, url);
117 QNetworkRequest request {downloadRequest.
url()};
119 if (downloadRequest.
userAgent().isEmpty())
122 request.setRawHeader(
"User-Agent", downloadRequest.
userAgent().toUtf8());
125 request.setRawHeader(
"Referer", request.url().toEncoded().data());
127 request.setRawHeader(
"Accept-Encoding",
"gzip");
129 request.setAttribute(QNetworkRequest::RedirectPolicyAttribute, QNetworkRequest::ManualRedirectPolicy);
157 m_instance =
nullptr;
170 const bool isSequentialService = m_sequentialServices.contains(
id);
174 connect(downloadHandler, &QObject::destroyed,
this, [
this,
id, downloadHandler]()
176 m_waitingJobs[id].removeOne(downloadHandler);
179 if (isSequentialService && m_busyServices.contains(
id))
181 m_waitingJobs[id].enqueue(downloadHandler);
185 qDebug(
"Downloading %s...", qUtf8Printable(downloadRequest.
url()));
186 if (isSequentialService)
187 m_busyServices.insert(
id);
188 downloadHandler->assignNetworkReply(m_networkManager.get(request));
191 return downloadHandler;
196 m_sequentialServices.insert(serviceID);
201 return m_networkManager.cookieJar()->cookiesForUrl(url);
206 return m_networkManager.cookieJar()->setCookiesFromUrl(cookieList, url);
211 return static_cast<NetworkCookieJar *
>(m_networkManager.cookieJar())->allCookies();
216 static_cast<NetworkCookieJar *
>(m_networkManager.cookieJar())->setAllCookies(cookieList);
221 return static_cast<NetworkCookieJar *
>(m_networkManager.cookieJar())->deleteCookie(cookie);
226 const QStringList schemes = instance()->m_networkManager.supportedSchemes();
227 return std::any_of(schemes.cbegin(), schemes.cend(), [&url](
const QString &scheme)
229 return url.startsWith((scheme + QLatin1Char(
':')), Qt::CaseInsensitive);
242 proxy.setHostName(proxyConfig.
ip);
243 proxy.setPort(proxyConfig.
port);
247 qDebug() << Q_FUNC_INFO <<
"using SOCKS proxy";
248 proxy.setType(QNetworkProxy::Socks5Proxy);
252 qDebug() << Q_FUNC_INFO <<
"using HTTP proxy";
253 proxy.setType(QNetworkProxy::HttpProxy);
256 if (proxyManager->isAuthenticationRequired())
258 qDebug(
"Proxy requires authentication, authenticating...");
259 proxy.setUser(proxyConfig.
username);
260 proxy.setPassword(proxyConfig.
password);
265 proxy.setType(QNetworkProxy::NoProxy);
268 m_networkManager.setProxy(proxy);
277 const auto waitingJobsIter = m_waitingJobs.find(
id);
278 if ((waitingJobsIter == m_waitingJobs.end()) || waitingJobsIter.value().isEmpty())
281 m_busyServices.remove(
id);
286 qDebug(
"Downloading %s...", qUtf8Printable(handler->url()));
287 handler->assignNetworkReply(m_networkManager.get(
createNetworkRequest(handler->downloadRequest())));
288 handler->disconnect(
this);
293 QStringList errorList;
294 for (
const QSslError &error : errors)
295 errorList += error.errorString();
296 LogMsg(tr(
"Ignoring SSL error, URL: \"%1\", errors: \"%2\"").arg(reply->url().toString(), errorList.join(
". ")),
Log::WARNING);
299 reply->ignoreSslErrors();
347 m_saveToFile =
value;
353 return m_destFileName;
358 m_destFileName =
value;
364 return {url.host(), url.
port(80)};
void finished(const DownloadResult &result)
DownloadManager(QObject *parent=nullptr)
void handleReplyFinished(const QNetworkReply *reply)
void ignoreSslErrors(QNetworkReply *, const QList< QSslError > &)
void setAllCookies(const QList< QNetworkCookie > &cookieList)
bool setCookiesFromUrl(const QList< QNetworkCookie > &cookieList, const QUrl &url)
QList< QNetworkCookie > allCookies() const
void registerSequentialService(const ServiceID &serviceID)
void applyProxySettings()
QNetworkAccessManager m_networkManager
bool deleteCookie(const QNetworkCookie &cookie)
static void freeInstance()
static bool hasSupportedScheme(const QString &url)
DownloadHandler * download(const DownloadRequest &downloadRequest)
static DownloadManager * instance()
QList< QNetworkCookie > cookiesForUrl(const QUrl &url) const
static void initInstance()
static DownloadManager * m_instance
QString userAgent() const
DownloadRequest(const QString &url)
QString destFileName() const
static ProxyConfigurationManager * instance()
void proxyConfigurationChanged()
static Preferences * instance()
void setNetworkCookies(const QList< QNetworkCookie > &cookies)
QList< QNetworkCookie > getNetworkCookies() const
bool setCookiesFromUrl(const QList< QNetworkCookie > &cookieList, const QUrl &url) override
~NetworkCookieJar() override
NetworkCookieJar(QObject *parent=nullptr)
QList< QNetworkCookie > cookiesForUrl(const QUrl &url) const override
constexpr std::add_const_t< T > & asConst(T &t) noexcept
void LogMsg(const QString &message, const Log::MsgType &type)
uint qHash(const TorrentID &key, uint seed)
bool operator==(const ServiceID &lhs, const ServiceID &rhs)
uint qHash(const ServiceID &serviceID, uint seed)
QNetworkRequest createNetworkRequest(const Net::DownloadRequest &downloadRequest)
const char DEFAULT_USER_AGENT[]
T value(const QString &key, const T &defaultValue={})
static ServiceID fromURL(const QUrl &url)