capybara-webkit/src/NetworkAccessManager.cpp

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);
}