88 lines
2.6 KiB
C++
88 lines
2.6 KiB
C++
#include "NetworkAccessManager.h"
|
|
#include "WebPage.h"
|
|
#include "NetworkReplyProxy.h"
|
|
#include "RequestHandler.h"
|
|
|
|
NetworkAccessManager::NetworkAccessManager(
|
|
RequestHandler * requestHandler,
|
|
QObject *parent
|
|
) : QNetworkAccessManager(parent) {
|
|
m_requestHandler = requestHandler;
|
|
connect(this, SIGNAL(authenticationRequired(QNetworkReply*,QAuthenticator*)), SLOT(provideAuthentication(QNetworkReply*,QAuthenticator*)));
|
|
connect(this, SIGNAL(finished(QNetworkReply *)), this, SLOT(finished(QNetworkReply *)));
|
|
disableKeyChainLookup();
|
|
}
|
|
|
|
QNetworkReply* NetworkAccessManager::sendRequest(
|
|
QNetworkAccessManager::Operation operation,
|
|
const QNetworkRequest &request,
|
|
QIODevice * outgoingData
|
|
) {
|
|
QNetworkReply *reply = new NetworkReplyProxy(
|
|
QNetworkAccessManager::createRequest(operation,
|
|
request,
|
|
outgoingData
|
|
),
|
|
this
|
|
);
|
|
|
|
QByteArray url = reply->request().url().toEncoded();
|
|
emit requestCreated(url, reply);
|
|
|
|
return reply;
|
|
}
|
|
|
|
QNetworkReply* NetworkAccessManager::createRequest(
|
|
QNetworkAccessManager::Operation operation,
|
|
const QNetworkRequest &unsafeRequest,
|
|
QIODevice * outgoingData = 0
|
|
) {
|
|
QNetworkRequest request(unsafeRequest);
|
|
QNetworkReply *reply =
|
|
m_requestHandler->handleRequest(this, operation, request, outgoingData);
|
|
return reply;
|
|
};
|
|
|
|
void NetworkAccessManager::finished(QNetworkReply *reply) {
|
|
QUrl redirectUrl = reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl();
|
|
if (redirectUrl.isValid())
|
|
m_redirectMappings[reply->url().resolved(redirectUrl)] = reply->url();
|
|
else {
|
|
QUrl requestedUrl = reply->url();
|
|
while (m_redirectMappings.contains(requestedUrl))
|
|
requestedUrl = m_redirectMappings.take(requestedUrl);
|
|
emit finished(requestedUrl, reply);
|
|
}
|
|
}
|
|
|
|
void NetworkAccessManager::reset() {
|
|
m_userName = QString();
|
|
m_password = QString();
|
|
}
|
|
|
|
void NetworkAccessManager::setUserName(const QString &userName) {
|
|
m_userName = userName;
|
|
}
|
|
|
|
void NetworkAccessManager::setPassword(const QString &password) {
|
|
m_password = password;
|
|
}
|
|
|
|
void NetworkAccessManager::provideAuthentication(QNetworkReply *reply, QAuthenticator *authenticator) {
|
|
Q_UNUSED(reply);
|
|
if (m_userName != authenticator->user())
|
|
authenticator->setUser(m_userName);
|
|
if (m_password != authenticator->password())
|
|
authenticator->setPassword(m_password);
|
|
}
|
|
|
|
/*
|
|
* This is a workaround for a Qt 5/OS X bug:
|
|
* https://bugreports.qt-project.org/browse/QTBUG-30434
|
|
*/
|
|
void NetworkAccessManager::disableKeyChainLookup() {
|
|
QNetworkProxy fixedProxy = proxy();
|
|
fixedProxy.setHostName(" ");
|
|
setProxy(fixedProxy);
|
|
}
|