GeezerVisonThe World Wide Web, restored to 800 pixels of glory. |
| Home|About|Gaming cabinet|Archives|How it works|Starter sites |
GeezerVison is showing github.com — sqlitebrowser/src/RemoteNetwork.cpp at master · sqlitebrowser/sqlitebrowser Expand file tree/ Copy pathRemoteNetwork.cppMore file actions 167 lines (140 loc) · 5.65 KB / Copy pathRemoteNetwork.cppFile metadata and controls167 lines (140 loc) · 5.65 KB 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 #include <QApplication> #include <QtNetwork/QNetworkAccessManager> #include <QMessageBox> #include <QtNetwork/QNetworkReply> #include <QtNetwork/QNetworkProxy> #include "RemoteNetwork.h" #include "Settings.h" #include "version.h" RemoteNetwork::RemoteNetwork() : m_manager(new QNetworkAccessManager) { // Load settings and set up some more stuff while doing so reloadSettings(); // Set up signals connect(m_manager, &QNetworkAccessManager::sslErrors, this, &RemoteNetwork::gotError); } RemoteNetwork::~RemoteNetwork() { delete m_manager; } void RemoteNetwork::reloadSettings() { // Configure proxy to use { QString type = Settings::getValue("proxy", "type").toString(); QNetworkProxy proxy; if(type == "system") { // For system settings we have to get the system-wide proxy and use that // Get list of proxies for accessing sqlitebrowser.org via HTTPS and use the first one auto list = QNetworkProxyFactory::systemProxyForQuery(QNetworkProxyQuery(QUrl("https://sqlitebrowser.org/"))); proxy = list.front(); } else { // For any other type we have to set up our own proxy configuration // Retrieve the required settings QString host = Settings::getValue("proxy", "host").toString(); unsigned short port = static_cast<unsigned short>(Settings::getValue("proxy", "port").toUInt()); bool authentication = Settings::getValue("proxy", "authentication").toBool(); if(type == "http") proxy.setType(QNetworkProxy::HttpProxy); else if(type == "socks5") proxy.setType(QNetworkProxy::Socks5Proxy); else proxy.setType(QNetworkProxy::NoProxy); proxy.setHostName(host); proxy.setPort(port); // Only set authentication details when authentication is required if(authentication) { QString user = Settings::getValue("proxy", "user").toString(); QString password = Settings::getValue("proxy", "password").toString(); proxy.setUser(user); proxy.setPassword(password); } } // Start using the new proxy configuration QNetworkProxy::setApplicationProxy(proxy); } } void RemoteNetwork::gotReply(QNetworkReply* reply) { // What type of data is this? RequestType type = static_cast<RequestType>(reply->property("type").toInt()); // Handle the reply data switch(type) { case RequestTypeCustom: break; } // Delete reply later, i.e. after returning from this slot function reply->deleteLater(); } void RemoteNetwork::fetch(const QUrl& url, RequestType type, std::function<void(QByteArray)> when_finished, bool synchronous, bool ignore_errors) { // Build network request QNetworkRequest request; request.setUrl(url); request.setRawHeader("User-Agent", QString("%1 %2").arg(qApp->organizationName(), APP_VERSION).toUtf8()); #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) request.setAttribute(QNetworkRequest::RedirectPolicyAttribute, QNetworkRequest::NoLessSafeRedirectPolicy); #elif QT_VERSION >= QT_VERSION_CHECK(5, 6, 0) request.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true); #endif // Fetch database and prepare pending reply for future processing QNetworkReply* reply = m_manager->get(request); reply->setProperty("type", type); reply->setProperty("ignore_errors", ignore_errors); // Hook up custom handler when there is one and global handler otherwise if(when_finished) { connect(reply, &QNetworkReply::finished, reply, [this, when_finished, reply]() { if(handleReply(reply)) when_finished(reply->readAll()); }); } else { connect(reply, &QNetworkReply::finished, this, [this, reply]() { if(handleReply(reply)) gotReply(reply); }); } // When the synchrounous flag is set we wait for the request to finish before continuing if(synchronous) { QEventLoop loop; connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit); loop.exec(); } } void RemoteNetwork::gotError(QNetworkReply* reply, const QList<QSslError>& errors) { // Are there any errors in here that aren't about self-signed certificates and non-matching hostnames? bool serious_errors = std::any_of(errors.begin(), errors.end(), [](const QSslError& error) { return error.error() != QSslError::SelfSignedCertificate; }); // Just stop the error checking here and accept the reply if there were no 'serious' errors if(!serious_errors) { reply->ignoreSslErrors(errors); return; } // Build an error message and show it to the user QString message = tr("Error opening remote file at %1.\n%2").arg(reply->url().toString(), errors.at(0).errorString()); QMessageBox::warning(nullptr, qApp->applicationName(), message); // Delete reply later, i.e. after returning from this slot function reply->deleteLater(); } bool RemoteNetwork::handleReply(QNetworkReply* reply) { // Check if request was successful if(reply->error() != QNetworkReply::NoError) { // Do not show error message when operation was cancelled on purpose if(reply->error() != QNetworkReply::OperationCanceledError && !reply->property("ignore_errors").toBool()) { QMessageBox::warning(nullptr, qApp->applicationName(), reply->errorString() + "\n" + reply->readAll()); } reply->deleteLater(); return false; } return true; } |
| You are visitor 01402503 — GeezerVison does not store the pages you look up. Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required. |