1 // For license of this file, see <project-root-folder>/LICENSE.md.
2 
3 #include "network-web/basenetworkaccessmanager.h"
4 
5 #include "miscellaneous/application.h"
6 #include "miscellaneous/textfactory.h"
7 
8 #include <QNetworkProxy>
9 #include <QNetworkReply>
10 #include <QNetworkRequest>
11 
BaseNetworkAccessManager(QObject * parent)12 BaseNetworkAccessManager::BaseNetworkAccessManager(QObject* parent)
13   : QNetworkAccessManager(parent) {
14   connect(this, &BaseNetworkAccessManager::sslErrors, this, &BaseNetworkAccessManager::onSslErrors);
15   loadSettings();
16 }
17 
loadSettings()18 void BaseNetworkAccessManager::loadSettings() {
19   QNetworkProxy new_proxy;
20   const QNetworkProxy::ProxyType selected_proxy_type = static_cast<QNetworkProxy::ProxyType>(qApp->settings()->value(GROUP(Proxy),
21                                                                                                                      SETTING(Proxy::Type)).
22                                                                                              toInt());
23 
24   if (selected_proxy_type == QNetworkProxy::ProxyType::NoProxy) {
25     // No extra setting is needed, set new proxy and exit this method.
26     setProxy(QNetworkProxy::ProxyType::NoProxy);
27   }
28   else {
29     qWarningNN << LOGSEC_NETWORK << "Using application-wide proxy.";
30 
31     if (QNetworkProxy::applicationProxy().type() != QNetworkProxy::ProxyType::DefaultProxy &&
32         QNetworkProxy::applicationProxy().type() != QNetworkProxy::ProxyType::NoProxy) {
33       qWarningNN << LOGSEC_NETWORK
34                  << "Used proxy address:"
35                  << QUOTE_W_SPACE_COMMA(QNetworkProxy::applicationProxy().hostName())
36                  << " type:"
37                  << QUOTE_W_SPACE_DOT(QNetworkProxy::applicationProxy().type());
38     }
39 
40     setProxy(QNetworkProxy::applicationProxy());
41   }
42 
43   qDebugNN << LOGSEC_NETWORK << "Settings of BaseNetworkAccessManager loaded.";
44 }
45 
onSslErrors(QNetworkReply * reply,const QList<QSslError> & error)46 void BaseNetworkAccessManager::onSslErrors(QNetworkReply* reply, const QList<QSslError>& error) {
47   qWarningNN << LOGSEC_NETWORK
48              << "Ignoring SSL errors for"
49              << QUOTE_W_SPACE_DOT(reply->url().toString());
50   reply->ignoreSslErrors(error);
51 }
52 
createRequest(QNetworkAccessManager::Operation op,const QNetworkRequest & request,QIODevice * outgoingData)53 QNetworkReply* BaseNetworkAccessManager::createRequest(QNetworkAccessManager::Operation op,
54                                                        const QNetworkRequest& request,
55                                                        QIODevice* outgoingData) {
56   QNetworkRequest new_request = request;
57 
58 #if defined(Q_OS_WIN)
59   new_request.setAttribute(QNetworkRequest::Attribute::HttpPipeliningAllowedAttribute, true);
60   new_request.setAttribute(QNetworkRequest::Attribute::Http2AllowedAttribute, true);
61 #endif
62 
63   new_request.setRawHeader(HTTP_HEADERS_COOKIE, QSL("JSESSIONID= ").toLocal8Bit());
64   new_request.setRawHeader(HTTP_HEADERS_USER_AGENT, QSL(APP_USERAGENT).toLocal8Bit());
65 
66   auto reply = QNetworkAccessManager::createRequest(op, new_request, outgoingData);
67   return reply;
68 }
69