From b6b276495b0d02e3bcfa62b793c83f5adcf178c7 Mon Sep 17 00:00:00 2001 From: Markus Goetz Date: Mon, 18 Oct 2010 16:10:15 +0200 Subject: Sockets: Private function for pausing/resuming notifiers This will be used by QNAM to prevent event loop recursion while emitting signals that often spin an event loop, e.g. authenticationRequired() displaying a dialog for the user. Reviewed-by: Peter Hartmann Reviewed-by: Prasanth Task-Number: QTBUG-13234 --- src/network/socket/qabstractsocket.cpp | 30 ++++++++++++++++++++++++++++++ src/network/socket/qabstractsocket_p.h | 7 +++++++ src/network/ssl/qsslsocket.cpp | 14 ++++++++++++++ src/network/ssl/qsslsocket_p.h | 2 ++ 4 files changed, 53 insertions(+) diff --git a/src/network/socket/qabstractsocket.cpp b/src/network/socket/qabstractsocket.cpp index 505db71..f03d102 100644 --- a/src/network/socket/qabstractsocket.cpp +++ b/src/network/socket/qabstractsocket.cpp @@ -1212,6 +1212,36 @@ void QAbstractSocketPrivate::fetchConnectionParameters() #endif } + +void QAbstractSocketPrivate::pauseSocketNotifiers(QAbstractSocket *socket) +{ + QAbstractSocketEngine *socketEngine = socket->d_func()->socketEngine; + if (!socketEngine) + return; + socket->d_func()->prePauseReadSocketNotifierState = socketEngine->isReadNotificationEnabled(); + socket->d_func()->prePauseWriteSocketNotifierState = socketEngine->isWriteNotificationEnabled(); + socket->d_func()->prePauseExceptionSocketNotifierState = socketEngine->isExceptionNotificationEnabled(); + socketEngine->setReadNotificationEnabled(false); + socketEngine->setWriteNotificationEnabled(false); + socketEngine->setExceptionNotificationEnabled(false); +} + +void QAbstractSocketPrivate::resumeSocketNotifiers(QAbstractSocket *socket) +{ + QAbstractSocketEngine *socketEngine = socket->d_func()->socketEngine; + if (!socketEngine) + return; + socketEngine->setReadNotificationEnabled(socket->d_func()->prePauseReadSocketNotifierState); + socketEngine->setWriteNotificationEnabled(socket->d_func()->prePauseWriteSocketNotifierState); + socketEngine->setExceptionNotificationEnabled(socket->d_func()->prePauseExceptionSocketNotifierState); +} + +QAbstractSocketEngine* QAbstractSocketPrivate::getSocketEngine(QAbstractSocket *socket) +{ + return socket->d_func()->socketEngine; +} + + /*! \internal Constructs a new abstract socket of type \a socketType. The \a diff --git a/src/network/socket/qabstractsocket_p.h b/src/network/socket/qabstractsocket_p.h index b51c301..7fba0fe 100644 --- a/src/network/socket/qabstractsocket_p.h +++ b/src/network/socket/qabstractsocket_p.h @@ -158,6 +158,13 @@ public: QAbstractSocket::SocketState state; QAbstractSocket::SocketError socketError; + + bool prePauseReadSocketNotifierState; + bool prePauseWriteSocketNotifierState; + bool prePauseExceptionSocketNotifierState; + static void pauseSocketNotifiers(QAbstractSocket*); + static void resumeSocketNotifiers(QAbstractSocket*); + static QAbstractSocketEngine* getSocketEngine(QAbstractSocket*); }; QT_END_NAMESPACE diff --git a/src/network/ssl/qsslsocket.cpp b/src/network/ssl/qsslsocket.cpp index c9f421f..a752720 100644 --- a/src/network/ssl/qsslsocket.cpp +++ b/src/network/ssl/qsslsocket.cpp @@ -2035,6 +2035,20 @@ void QSslSocketPrivate::createPlainSocket(QIODevice::OpenMode openMode) q->setReadBufferSize(readBufferMaxSize); } +void QSslSocketPrivate::pauseSocketNotifiers(QSslSocket *socket) +{ + if (!socket->d_func()->plainSocket) + return; + QAbstractSocketPrivate::pauseSocketNotifiers(socket->d_func()->plainSocket); +} + +void QSslSocketPrivate::resumeSocketNotifiers(QSslSocket *socket) +{ + if (!socket->d_func()->plainSocket) + return; + QAbstractSocketPrivate::resumeSocketNotifiers(socket->d_func()->plainSocket); +} + /*! \internal */ diff --git a/src/network/ssl/qsslsocket_p.h b/src/network/ssl/qsslsocket_p.h index 72b3ef7..94f5f39 100644 --- a/src/network/ssl/qsslsocket_p.h +++ b/src/network/ssl/qsslsocket_p.h @@ -142,6 +142,8 @@ public: // The socket itself, including private slots. QTcpSocket *plainSocket; void createPlainSocket(QIODevice::OpenMode openMode); + static void pauseSocketNotifiers(QSslSocket*); + static void resumeSocketNotifiers(QSslSocket*); void _q_connectedSlot(); void _q_hostFoundSlot(); void _q_disconnectedSlot(); -- cgit v0.12 From 4c29a590cbdd68006906cb8ce3250f8d19caa3d6 Mon Sep 17 00:00:00 2001 From: Markus Goetz Date: Mon, 18 Oct 2010 16:21:47 +0200 Subject: QAuthenticator: Fix NTLMv2 credential caching of QNAM QNetworkAccessManager used the user() function for caching the credentials when doing HTTP authentication with NTLMv2. For that to work it needs to return the same value as was put in with setUser(). Reviewed-by: Peter Hartmann Reviewed-by: Prasanth Task-Number: QTBUG-13234 --- src/network/kernel/qauthenticator.cpp | 14 ++++++++------ src/network/kernel/qauthenticator_p.h | 1 + 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/network/kernel/qauthenticator.cpp b/src/network/kernel/qauthenticator.cpp index f97d833..220f7da 100644 --- a/src/network/kernel/qauthenticator.cpp +++ b/src/network/kernel/qauthenticator.cpp @@ -232,19 +232,21 @@ void QAuthenticator::setUser(const QString &user) //domain name is present d->realm.clear(); d->userDomain = user.left(separatorPosn); - d->user = user.mid(separatorPosn + 1); + d->extractedUser = user.mid(separatorPosn + 1); + d->user = user; } else if((separatorPosn = user.indexOf(QLatin1String("@"))) != -1) { //domain name is present d->realm.clear(); d->userDomain = user.left(separatorPosn); - d->user = user.left(separatorPosn); + d->extractedUser = user.left(separatorPosn); + d->user = user; } else { + d->extractedUser = user; d->user = user; d->realm.clear(); d->userDomain.clear(); } break; - // For other auth mechanisms, domain name will be part of username default: d->user = user; break; @@ -1196,7 +1198,7 @@ static QByteArray qCreatev2Hash(const QAuthenticatorPrivate *ctx, Q_ASSERT(hashKey.size() == 16); // Assuming the user and domain is always unicode in challenge QByteArray message = - qStringAsUcs2Le(ctx->user.toUpper()) + + qStringAsUcs2Le(ctx->extractedUser.toUpper()) + qStringAsUcs2Le(phase3->domainStr); phase3->v2Hash = qEncodeHmacMd5(hashKey, message); @@ -1401,8 +1403,8 @@ static QByteArray qNtlmPhase3(QAuthenticatorPrivate *ctx, const QByteArray& phas pb.domainStr = ctx->userDomain; } - offset = qEncodeNtlmString(pb.user, offset, ctx->user, unicode); - pb.userStr = ctx->user; + offset = qEncodeNtlmString(pb.user, offset, ctx->extractedUser, unicode); + pb.userStr = ctx->extractedUser; offset = qEncodeNtlmString(pb.workstation, offset, ctx->workstation, unicode); pb.workstationStr = ctx->workstation; diff --git a/src/network/kernel/qauthenticator_p.h b/src/network/kernel/qauthenticator_p.h index 4e09360..9f2e607 100644 --- a/src/network/kernel/qauthenticator_p.h +++ b/src/network/kernel/qauthenticator_p.h @@ -71,6 +71,7 @@ public: QAtomicInt ref; QString user; + QString extractedUser; QString password; QVariantHash options; Method method; -- cgit v0.12 From d18292563cc6bfee3876b830420b1f29c0a6c260 Mon Sep 17 00:00:00 2001 From: Markus Goetz Date: Tue, 19 Oct 2010 16:01:01 +0200 Subject: QNAM: Do not load credentials from cache prematurely The credentials shall only be loaded on demand, e.g. after the HTTP code emits authenticationRequired() Reviewed-by: Prasanth Task-Number: QTBUG-13234 --- src/network/access/qnetworkaccessmanager.cpp | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/src/network/access/qnetworkaccessmanager.cpp b/src/network/access/qnetworkaccessmanager.cpp index 12fe094..0d33a46 100644 --- a/src/network/access/qnetworkaccessmanager.cpp +++ b/src/network/access/qnetworkaccessmanager.cpp @@ -1025,16 +1025,8 @@ QNetworkReply *QNetworkAccessManager::createRequest(QNetworkAccessManager::Opera priv->manager = this; // second step: fetch cached credentials - if (static_cast - (request.attribute(QNetworkRequest::AuthenticationReuseAttribute, - QNetworkRequest::Automatic).toInt()) == QNetworkRequest::Automatic) { - QNetworkAuthenticationCredential *cred = d->fetchCachedCredentials(url); - if (cred) { - url.setUserName(cred->user); - url.setPassword(cred->password); - priv->urlForLastAuthentication = url; - } - } + // This is not done for the time being, we should use signal emissions to request + // the credentials from cache. // third step: find a backend priv->backend = d->findBackend(op, request); @@ -1116,7 +1108,9 @@ void QNetworkAccessManagerPrivate::authenticationRequired(QNetworkAccessBackend // don't try the cache for the same URL twice in a row // being called twice for the same URL means the authentication failed - if (url != backend->reply->urlForLastAuthentication) { + // also called when last URL is empty, e.g. on first call + if (backend->reply->urlForLastAuthentication.isEmpty() + || url != backend->reply->urlForLastAuthentication) { QNetworkAuthenticationCredential *cred = fetchCachedCredentials(url, authenticator); if (cred) { authenticator->setUser(cred->user); -- cgit v0.12 From 9bc5a32b875b812c3a706034c8c27614f86bd138 Mon Sep 17 00:00:00 2001 From: Markus Goetz Date: Tue, 19 Oct 2010 16:05:21 +0200 Subject: QNAM HTTP: Move caching of credentials from URL The credentials are now cached when the request gets sent. Reviewed-by: Peter Hartmann Reviewed-by: Prasanth Task-Number: QTBUG-13234 --- src/network/access/qhttpnetworkconnection.cpp | 11 +++++------ src/network/access/qhttpnetworkconnectionchannel.cpp | 1 + 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/network/access/qhttpnetworkconnection.cpp b/src/network/access/qhttpnetworkconnection.cpp index ccdbb20..54a7548 100644 --- a/src/network/access/qhttpnetworkconnection.cpp +++ b/src/network/access/qhttpnetworkconnection.cpp @@ -338,13 +338,9 @@ bool QHttpNetworkConnectionPrivate::handleAuthenticateChallenge(QAbstractSocket copyCredentials(i, auth, isProxy); QMetaObject::invokeMethod(q, "_q_restartAuthPendingRequests", Qt::QueuedConnection); } - } else if (priv->phase == QAuthenticatorPrivate::Start) { - // If the url's authenticator has a 'user' set we will end up here (phase is only set to 'Done' by - // parseHttpResponse above if 'user' is empty). So if credentials were supplied with the request, - // such as in the case of an XMLHttpRequest, this is our only opportunity to cache them. - emit q->cacheCredentials(reply->request(), auth, q); } - // - Changing values in QAuthenticator will reset the 'phase'. + // - Changing values in QAuthenticator will reset the 'phase'. Therefore if it is still "Done" + // then nothing was filled in by the user or the cache // - If withCredentials has been set to false (e.g. by QtWebKit for a cross-origin XMLHttpRequest) then // we need to bail out if authentication is required. if (priv->phase == QAuthenticatorPrivate::Done || !reply->request().withCredentials()) { @@ -380,6 +376,7 @@ void QHttpNetworkConnectionPrivate::createAuthorization(QAbstractSocket *socket, int i = indexOf(socket); + // Send "Authorization" header, but not if it's NTLM and the socket is already authenticated. if (channels[i].authMehtod != QAuthenticatorPrivate::None) { if (!(channels[i].authMehtod == QAuthenticatorPrivate::Ntlm && channels[i].lastStatus != 401)) { QAuthenticatorPrivate *priv = QAuthenticatorPrivate::getPrivate(channels[i].authenticator); @@ -389,6 +386,8 @@ void QHttpNetworkConnectionPrivate::createAuthorization(QAbstractSocket *socket, } } } + + // Send "Proxy-Authorization" header, but not if it's NTLM and the socket is already authenticated. if (channels[i].proxyAuthMehtod != QAuthenticatorPrivate::None) { if (!(channels[i].proxyAuthMehtod == QAuthenticatorPrivate::Ntlm && channels[i].lastStatus != 407)) { QAuthenticatorPrivate *priv = QAuthenticatorPrivate::getPrivate(channels[i].proxyAuthenticator); diff --git a/src/network/access/qhttpnetworkconnectionchannel.cpp b/src/network/access/qhttpnetworkconnectionchannel.cpp index d10f951..f83e7c1 100644 --- a/src/network/access/qhttpnetworkconnectionchannel.cpp +++ b/src/network/access/qhttpnetworkconnectionchannel.cpp @@ -190,6 +190,7 @@ bool QHttpNetworkConnectionChannel::sendRequest() || (!url.password().isEmpty() && url.password() != auth.password())) { auth.setUser(url.userName()); auth.setPassword(url.password()); + emit connection->cacheCredentials(request, &auth, connection); connection->d_func()->copyCredentials(connection->d_func()->indexOf(socket), &auth, false); } // clear the userinfo, since we use the same request for resending -- cgit v0.12 From f706263856085df62507414ff0bcbadeca6dcfe5 Mon Sep 17 00:00:00 2001 From: Markus Goetz Date: Tue, 19 Oct 2010 16:07:21 +0200 Subject: QNAM HTTP: Do not copy around credentials when using NTLM Copying the username and password messes up the state inside the QAuthenticator. Do not do it. Reviewed-by: Prasanth Task-Number: QTBUG-13234 --- src/network/access/qhttpnetworkconnection.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/network/access/qhttpnetworkconnection.cpp b/src/network/access/qhttpnetworkconnection.cpp index 54a7548..32881b2 100644 --- a/src/network/access/qhttpnetworkconnection.cpp +++ b/src/network/access/qhttpnetworkconnection.cpp @@ -257,6 +257,13 @@ void QHttpNetworkConnectionPrivate::copyCredentials(int fromChannel, QAuthentica { Q_ASSERT(auth); + // NTLM is a multi phase authentication. Copying credentials between authenticators would mess things up. + if (!isProxy && channels[fromChannel].authMehtod == QAuthenticatorPrivate::Ntlm) + return; + if (isProxy && channels[fromChannel].proxyAuthMehtod == QAuthenticatorPrivate::Ntlm) + return; + + // select another channel QAuthenticator* otherAuth = 0; for (int i = 0; i < channelCount; ++i) { -- cgit v0.12 From 07fd031d29198cc5a0d6f1da6bb8fea29274fa06 Mon Sep 17 00:00:00 2001 From: Markus Goetz Date: Tue, 19 Oct 2010 16:16:38 +0200 Subject: QNAM HTTP: Pause sockets while emitting to user code. This is needed because user code might display a dialog which spins an event loop and could make the sockets readyRead() fire. This event loop recursion is not desired as it can lead to nasty bugs when the state is messed up. Reviewed-by: Peter Hartmann Reviewed-by: Prasanth Task-Number: QTBUG-13234 --- src/network/access/qhttpnetworkconnection.cpp | 82 +++++++++++++++------------ src/network/access/qhttpnetworkconnection_p.h | 15 +++-- 2 files changed, 56 insertions(+), 41 deletions(-) diff --git a/src/network/access/qhttpnetworkconnection.cpp b/src/network/access/qhttpnetworkconnection.cpp index 32881b2..f8f7620 100644 --- a/src/network/access/qhttpnetworkconnection.cpp +++ b/src/network/access/qhttpnetworkconnection.cpp @@ -45,6 +45,7 @@ #include #include #include +#include #include #include @@ -56,6 +57,7 @@ #ifndef QT_NO_HTTP #ifndef QT_NO_OPENSSL +# include # include # include # include @@ -79,9 +81,9 @@ const int QHttpNetworkConnectionPrivate::defaultRePipelineLength = 2; QHttpNetworkConnectionPrivate::QHttpNetworkConnectionPrivate(const QString &hostName, quint16 port, bool encrypt) -: hostName(hostName), port(port), encrypt(encrypt), - channelCount(defaultChannelCount), - pendingAuthSignal(false), pendingProxyAuthSignal(false) +: state(RunningState), + hostName(hostName), port(port), encrypt(encrypt), + channelCount(defaultChannelCount) #ifndef QT_NO_NETWORKPROXY , networkProxy(QNetworkProxy::NoProxy) #endif @@ -90,9 +92,9 @@ QHttpNetworkConnectionPrivate::QHttpNetworkConnectionPrivate(const QString &host } QHttpNetworkConnectionPrivate::QHttpNetworkConnectionPrivate(quint16 channelCount, const QString &hostName, quint16 port, bool encrypt) -: hostName(hostName), port(port), encrypt(encrypt), - channelCount(channelCount), - pendingAuthSignal(false), pendingProxyAuthSignal(false) +: state(RunningState), + hostName(hostName), port(port), encrypt(encrypt), + channelCount(channelCount) #ifndef QT_NO_NETWORKPROXY , networkProxy(QNetworkProxy::NoProxy) #endif @@ -121,6 +123,37 @@ void QHttpNetworkConnectionPrivate::init() } } +void QHttpNetworkConnectionPrivate::pauseConnection() +{ + state = PausedState; + + // Disable all socket notifiers + for (int i = 0; i < channelCount; i++) { + if (encrypt) + QSslSocketPrivate::pauseSocketNotifiers(static_cast(channels[i].socket)); + else + QAbstractSocketPrivate::pauseSocketNotifiers(channels[i].socket); + } +} + +void QHttpNetworkConnectionPrivate::resumeConnection() +{ + state = RunningState; + // Enable all socket notifiers + for (int i = 0; i < channelCount; i++) { + if (encrypt) + QSslSocketPrivate::resumeSocketNotifiers(static_cast(channels[i].socket)); + else + QAbstractSocketPrivate::resumeSocketNotifiers(channels[i].socket); + } + + // Resume uploads + // FIXME + + // queue _q_startNextRequest + QMetaObject::invokeMethod(this->q_func(), "_q_startNextRequest", Qt::QueuedConnection); +} + int QHttpNetworkConnectionPrivate::indexOf(QAbstractSocket *socket) const { for (int i = 0; i < channelCount; ++i) @@ -315,35 +348,19 @@ bool QHttpNetworkConnectionPrivate::handleAuthenticateChallenge(QAbstractSocket priv->parseHttpResponse(fields, isProxy); if (priv->phase == QAuthenticatorPrivate::Done) { - if ((isProxy && pendingProxyAuthSignal) ||(!isProxy && pendingAuthSignal)) { - // drop the request - reply->d_func()->eraseData(); - channels[i].close(); - channels[i].lastStatus = 0; - channels[i].state = QHttpNetworkConnectionChannel::Wait4AuthState; - return false; - } - // cannot use this socket until the slot returns - channels[i].state = QHttpNetworkConnectionChannel::WaitingState; - socket->blockSignals(true); + pauseConnection(); if (!isProxy) { - pendingAuthSignal = true; emit q->authenticationRequired(reply->request(), auth, q); - pendingAuthSignal = false; #ifndef QT_NO_NETWORKPROXY } else { - pendingProxyAuthSignal = true; emit q->proxyAuthenticationRequired(networkProxy, auth, q); - pendingProxyAuthSignal = false; #endif } - socket->blockSignals(false); - // socket free to use - channels[i].state = QHttpNetworkConnectionChannel::IdleState; + resumeConnection(); + if (priv->phase != QAuthenticatorPrivate::Done) { // send any pending requests copyCredentials(i, auth, isProxy); - QMetaObject::invokeMethod(q, "_q_restartAuthPendingRequests", Qt::QueuedConnection); } } // - Changing values in QAuthenticator will reset the 'phase'. Therefore if it is still "Done" @@ -729,6 +746,10 @@ void QHttpNetworkConnectionPrivate::removeReply(QHttpNetworkReply *reply) // although it is called _q_startNextRequest, it will actually start multiple requests when possible void QHttpNetworkConnectionPrivate::_q_startNextRequest() { + // If the QHttpNetworkConnection is currently paused then bail out immediatly + if (state == PausedState) + return; + //resend the necessary ones. for (int i = 0; i < channelCount; ++i) { if (channels[i].resendCurrent) { @@ -779,17 +800,6 @@ void QHttpNetworkConnectionPrivate::_q_startNextRequest() fillPipeline(channels[i].socket); } -void QHttpNetworkConnectionPrivate::_q_restartAuthPendingRequests() -{ - // send the request using the idle socket - for (int i = 0 ; i < channelCount; ++i) { - if (channels[i].state == QHttpNetworkConnectionChannel::Wait4AuthState) { - channels[i].state = QHttpNetworkConnectionChannel::IdleState; - if (channels[i].reply) - channels[i].sendRequest(); - } - } -} void QHttpNetworkConnectionPrivate::readMoreLater(QHttpNetworkReply *reply) { diff --git a/src/network/access/qhttpnetworkconnection_p.h b/src/network/access/qhttpnetworkconnection_p.h index 51666d6..f2e0b1c 100644 --- a/src/network/access/qhttpnetworkconnection_p.h +++ b/src/network/access/qhttpnetworkconnection_p.h @@ -141,10 +141,10 @@ private: Q_DECLARE_PRIVATE(QHttpNetworkConnection) Q_DISABLE_COPY(QHttpNetworkConnection) friend class QHttpNetworkReply; + friend class QHttpNetworkReplyPrivate; friend class QHttpNetworkConnectionChannel; Q_PRIVATE_SLOT(d_func(), void _q_startNextRequest()) - Q_PRIVATE_SLOT(d_func(), void _q_restartAuthPendingRequests()) }; @@ -160,11 +160,20 @@ public: static const int defaultPipelineLength; static const int defaultRePipelineLength; + enum ConnectionState { + RunningState = 0, + PausedState = 1, + }; + QHttpNetworkConnectionPrivate(const QString &hostName, quint16 port, bool encrypt); QHttpNetworkConnectionPrivate(quint16 channelCount, const QString &hostName, quint16 port, bool encrypt); ~QHttpNetworkConnectionPrivate(); void init(); + void pauseConnection(); + void resumeConnection(); + ConnectionState state; + enum { ChunkSize = 4096 }; int indexOf(QAbstractSocket *socket) const; @@ -184,7 +193,6 @@ public: // private slots void _q_startNextRequest(); // send the next request from the queue - void _q_restartAuthPendingRequests(); // send the currently blocked request void createAuthorization(QAbstractSocket *socket, QHttpNetworkRequest &request); @@ -203,9 +211,6 @@ public: const int channelCount; QHttpNetworkConnectionChannel *channels; // parallel connections to the server - bool pendingAuthSignal; // there is an incomplete authentication signal - bool pendingProxyAuthSignal; // there is an incomplete proxy authentication signal - qint64 uncompressedBytesAvailable(const QHttpNetworkReply &reply) const; qint64 uncompressedBytesAvailableNextBlock(const QHttpNetworkReply &reply) const; -- cgit v0.12 From 04cc5144a8d1d1eb51fb627327e155649ba2ce45 Mon Sep 17 00:00:00 2001 From: Markus Goetz Date: Tue, 19 Oct 2010 16:19:29 +0200 Subject: QNAM HTTP: Process authenticationRequired() from HTTP properly Fixes a bug where a different QNetworkReply(Impl) handles an authentication request. Reviewed-by: Peter Hartmann Reviewed-by: Prasanth Task-Number: QTBUG-13234 --- src/network/access/qhttpnetworkconnection.cpp | 2 +- src/network/access/qhttpnetworkconnection_p.h | 2 +- src/network/access/qnetworkaccesshttpbackend.cpp | 11 +++++++---- src/network/access/qnetworkaccesshttpbackend_p.h | 2 +- .../qhttpnetworkconnection/tst_qhttpnetworkconnection.cpp | 8 ++++---- 5 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/network/access/qhttpnetworkconnection.cpp b/src/network/access/qhttpnetworkconnection.cpp index f8f7620..f6cb530 100644 --- a/src/network/access/qhttpnetworkconnection.cpp +++ b/src/network/access/qhttpnetworkconnection.cpp @@ -350,7 +350,7 @@ bool QHttpNetworkConnectionPrivate::handleAuthenticateChallenge(QAbstractSocket if (priv->phase == QAuthenticatorPrivate::Done) { pauseConnection(); if (!isProxy) { - emit q->authenticationRequired(reply->request(), auth, q); + emit q->authenticationRequired(reply, reply->request(), auth, q); #ifndef QT_NO_NETWORKPROXY } else { emit q->proxyAuthenticationRequired(networkProxy, auth, q); diff --git a/src/network/access/qhttpnetworkconnection_p.h b/src/network/access/qhttpnetworkconnection_p.h index f2e0b1c..875c978 100644 --- a/src/network/access/qhttpnetworkconnection_p.h +++ b/src/network/access/qhttpnetworkconnection_p.h @@ -131,7 +131,7 @@ Q_SIGNALS: void proxyAuthenticationRequired(const QNetworkProxy &proxy, QAuthenticator *authenticator, const QHttpNetworkConnection *connection = 0); #endif - void authenticationRequired(const QHttpNetworkRequest &request, QAuthenticator *authenticator, + void authenticationRequired(const QHttpNetworkReply*, const QHttpNetworkRequest &request, QAuthenticator *authenticator, const QHttpNetworkConnection *connection = 0); void cacheCredentials(const QHttpNetworkRequest &request, QAuthenticator *authenticator, const QHttpNetworkConnection *connection = 0); diff --git a/src/network/access/qnetworkaccesshttpbackend.cpp b/src/network/access/qnetworkaccesshttpbackend.cpp index f617244..2af4987 100644 --- a/src/network/access/qnetworkaccesshttpbackend.cpp +++ b/src/network/access/qnetworkaccesshttpbackend.cpp @@ -344,8 +344,8 @@ void QNetworkAccessHttpBackend::setupConnection() connect(http, SIGNAL(proxyAuthenticationRequired(QNetworkProxy,QAuthenticator*)), SLOT(proxyAuthenticationRequired(QNetworkProxy,QAuthenticator*))); #endif - connect(http, SIGNAL(authenticationRequired(QHttpNetworkRequest,QAuthenticator*)), - SLOT(httpAuthenticationRequired(QHttpNetworkRequest,QAuthenticator*))); + connect(http, SIGNAL(authenticationRequired(const QHttpNetworkReply*, QHttpNetworkRequest,QAuthenticator*,const QHttpNetworkConnection*)), + SLOT(httpAuthenticationRequired(const QHttpNetworkReply*, QHttpNetworkRequest,QAuthenticator*))); connect(http, SIGNAL(cacheCredentials(QHttpNetworkRequest,QAuthenticator*)), SLOT(httpCacheCredentials(QHttpNetworkRequest,QAuthenticator*))); connect(http, SIGNAL(error(QNetworkReply::NetworkError,QString)), @@ -862,10 +862,13 @@ void QNetworkAccessHttpBackend::replyHeaderChanged() metaDataChanged(); } -void QNetworkAccessHttpBackend::httpAuthenticationRequired(const QHttpNetworkRequest &, +void QNetworkAccessHttpBackend::httpAuthenticationRequired(const QHttpNetworkReply *reply, + const QHttpNetworkRequest &, QAuthenticator *auth) { - authenticationRequired(auth); + // Only process this signal when it is for the QHttpNetworkReply that we actually have + if (reply == this->httpReply) + authenticationRequired(auth); } void QNetworkAccessHttpBackend::httpCacheCredentials(const QHttpNetworkRequest &, diff --git a/src/network/access/qnetworkaccesshttpbackend_p.h b/src/network/access/qnetworkaccesshttpbackend_p.h index c4c88ae..f06f364 100644 --- a/src/network/access/qnetworkaccesshttpbackend_p.h +++ b/src/network/access/qnetworkaccesshttpbackend_p.h @@ -104,7 +104,7 @@ private slots: void replyReadyRead(); void replyFinished(); void replyHeaderChanged(); - void httpAuthenticationRequired(const QHttpNetworkRequest &request, QAuthenticator *auth); + void httpAuthenticationRequired(const QHttpNetworkReply*, const QHttpNetworkRequest &request, QAuthenticator *auth); void httpCacheCredentials(const QHttpNetworkRequest &request, QAuthenticator *auth); void httpError(QNetworkReply::NetworkError error, const QString &errorString); bool sendCacheContents(const QNetworkCacheMetaData &metaData); diff --git a/tests/auto/qhttpnetworkconnection/tst_qhttpnetworkconnection.cpp b/tests/auto/qhttpnetworkconnection/tst_qhttpnetworkconnection.cpp index 89f608e..c0f503b 100644 --- a/tests/auto/qhttpnetworkconnection/tst_qhttpnetworkconnection.cpp +++ b/tests/auto/qhttpnetworkconnection/tst_qhttpnetworkconnection.cpp @@ -57,7 +57,7 @@ public: public Q_SLOTS: void finishedReply(); void finishedWithError(QNetworkReply::NetworkError errorCode, const QString &detail); - void challenge401(const QHttpNetworkRequest &request, QAuthenticator *authenticator, const QHttpNetworkConnection *connection); + void challenge401(const QHttpNetworkReply*, const QHttpNetworkRequest &request, QAuthenticator *authenticator, const QHttpNetworkConnection *connection); #ifndef QT_NO_OPENSSL void sslErrors(const QList &errors); #endif @@ -495,7 +495,7 @@ void tst_QHttpNetworkConnection::_connect() QVERIFY(false); } -void tst_QHttpNetworkConnection::challenge401(const QHttpNetworkRequest &request, +void tst_QHttpNetworkConnection::challenge401(const QHttpNetworkReply*, const QHttpNetworkRequest &request, QAuthenticator *authenticator, const QHttpNetworkConnection *connection) { @@ -552,8 +552,8 @@ void tst_QHttpNetworkConnection::get401() if (encrypt) connection.enableEncryption(); QCOMPARE(connection.isEncrypted(), encrypt); - connect(&connection, SIGNAL(authenticationRequired(const QHttpNetworkRequest&, QAuthenticator *, const QHttpNetworkConnection*)), - SLOT(challenge401(const QHttpNetworkRequest&, QAuthenticator *, const QHttpNetworkConnection*))); + connect(&connection, SIGNAL(authenticationRequired(const QHttpNetworkReply*, const QHttpNetworkRequest&, QAuthenticator *, const QHttpNetworkConnection*)), + SLOT(challenge401(const QHttpNetworkReply*, const QHttpNetworkRequest&, QAuthenticator *, const QHttpNetworkConnection*))); connection.setProperty("setCredentials", setCredentials); connection.setProperty("username", username); connection.setProperty("password", password); -- cgit v0.12 From a8818493d4c782527dec7c30e9688d0e45a21351 Mon Sep 17 00:00:00 2001 From: Markus Goetz Date: Tue, 19 Oct 2010 16:38:48 +0200 Subject: QNAM HTTP: Also resume uploads after connection pause Reviewed-by: Peter Hartmann Reviewed-by: Prasanth Task-Number: QTBUG-13234 --- src/network/access/qhttpnetworkconnection.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/network/access/qhttpnetworkconnection.cpp b/src/network/access/qhttpnetworkconnection.cpp index f6cb530..8e8c34d 100644 --- a/src/network/access/qhttpnetworkconnection.cpp +++ b/src/network/access/qhttpnetworkconnection.cpp @@ -145,10 +145,11 @@ void QHttpNetworkConnectionPrivate::resumeConnection() QSslSocketPrivate::resumeSocketNotifiers(static_cast(channels[i].socket)); else QAbstractSocketPrivate::resumeSocketNotifiers(channels[i].socket); - } - // Resume uploads - // FIXME + // Resume pending upload if needed + if (channels[i].state == QHttpNetworkConnectionChannel::WritingState) + QMetaObject::invokeMethod(&channels[i], "_q_uploadDataReadyRead", Qt::QueuedConnection); + } // queue _q_startNextRequest QMetaObject::invokeMethod(this->q_func(), "_q_startNextRequest", Qt::QueuedConnection); -- cgit v0.12 From 0284bd11c8062108f8cff85175341bc9823b8ab4 Mon Sep 17 00:00:00 2001 From: Markus Goetz Date: Tue, 19 Oct 2010 17:20:31 +0200 Subject: QNAM HTTP: Also pause connection when emitting sslErrors() Pause the socket notifiers because the user could be displaying a dialog which makes the event loop run and could make our socket notifiers fire. Reviewed-by: Peter Hartmann Reviewed-by: Prasanth Task-Number: QTBUG-13234 --- src/network/access/qhttpnetworkconnectionchannel.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/network/access/qhttpnetworkconnectionchannel.cpp b/src/network/access/qhttpnetworkconnectionchannel.cpp index f83e7c1..d6b3f94 100644 --- a/src/network/access/qhttpnetworkconnectionchannel.cpp +++ b/src/network/access/qhttpnetworkconnectionchannel.cpp @@ -1035,7 +1035,11 @@ void QHttpNetworkConnectionChannel::_q_sslErrors(const QList &errors) if (!socket) return; //QNetworkReply::NetworkError errorCode = QNetworkReply::ProtocolFailure; + // Also pause the connection because socket notifiers may fire while an user + // dialog is displaying + connection->d_func()->pauseConnection(); emit connection->sslErrors(errors); + connection->d_func()->resumeConnection(); } void QHttpNetworkConnectionChannel::_q_encryptedBytesWritten(qint64 bytes) -- cgit v0.12 From 32da94f1e58cf8591610bd3676ba448b5d7e55c0 Mon Sep 17 00:00:00 2001 From: Markus Goetz Date: Tue, 19 Oct 2010 17:25:38 +0200 Subject: QNAM HTTP: Pause connection when emitting proxy auth signal Pause the socket notifiers because the user could be displaying a dialog which makes the event loop run and could make our socket notifiers fire. Reviewed-by: Prasanth Task-Number: QTBUG-13234 --- src/network/access/qhttpnetworkconnection.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/network/access/qhttpnetworkconnection.cpp b/src/network/access/qhttpnetworkconnection.cpp index 8e8c34d..d861cc1 100644 --- a/src/network/access/qhttpnetworkconnection.cpp +++ b/src/network/access/qhttpnetworkconnection.cpp @@ -969,7 +969,11 @@ void QHttpNetworkConnection::ignoreSslErrors(const QList &errors, int void QHttpNetworkConnectionPrivate::emitProxyAuthenticationRequired(const QHttpNetworkConnectionChannel *chan, const QNetworkProxy &proxy, QAuthenticator* auth) { Q_Q(QHttpNetworkConnection); + // Also pause the connection because socket notifiers may fire while an user + // dialog is displaying + pauseConnection(); emit q->proxyAuthenticationRequired(proxy, auth, q); + resumeConnection(); int i = indexOf(chan->socket); copyCredentials(i, auth, true); } -- cgit v0.12 From cbe5481271ff5470db047d7f133073ec37cf487c Mon Sep 17 00:00:00 2001 From: Markus Goetz Date: Tue, 19 Oct 2010 17:32:47 +0200 Subject: QNAM HTTP: Internal variable spelling mistakes Reviewed-by: Prasanth Task-Number: QTBUG-13234 --- src/network/access/qhttpnetworkconnection.cpp | 16 ++++++++-------- src/network/access/qhttpnetworkconnectionchannel.cpp | 4 ++-- src/network/access/qhttpnetworkconnectionchannel_p.h | 4 ++-- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/network/access/qhttpnetworkconnection.cpp b/src/network/access/qhttpnetworkconnection.cpp index d861cc1..b7380b5 100644 --- a/src/network/access/qhttpnetworkconnection.cpp +++ b/src/network/access/qhttpnetworkconnection.cpp @@ -292,9 +292,9 @@ void QHttpNetworkConnectionPrivate::copyCredentials(int fromChannel, QAuthentica Q_ASSERT(auth); // NTLM is a multi phase authentication. Copying credentials between authenticators would mess things up. - if (!isProxy && channels[fromChannel].authMehtod == QAuthenticatorPrivate::Ntlm) + if (!isProxy && channels[fromChannel].authMethod == QAuthenticatorPrivate::Ntlm) return; - if (isProxy && channels[fromChannel].proxyAuthMehtod == QAuthenticatorPrivate::Ntlm) + if (isProxy && channels[fromChannel].proxyAuthMethod == QAuthenticatorPrivate::Ntlm) return; @@ -337,10 +337,10 @@ bool QHttpNetworkConnectionPrivate::handleAuthenticateChallenge(QAbstractSocket QAuthenticator* auth = 0; if (isProxy) { auth = &channels[i].proxyAuthenticator; - channels[i].proxyAuthMehtod = authMethod; + channels[i].proxyAuthMethod = authMethod; } else { auth = &channels[i].authenticator; - channels[i].authMehtod = authMethod; + channels[i].authMethod = authMethod; } //proceed with the authentication. if (auth->isNull()) @@ -402,8 +402,8 @@ void QHttpNetworkConnectionPrivate::createAuthorization(QAbstractSocket *socket, int i = indexOf(socket); // Send "Authorization" header, but not if it's NTLM and the socket is already authenticated. - if (channels[i].authMehtod != QAuthenticatorPrivate::None) { - if (!(channels[i].authMehtod == QAuthenticatorPrivate::Ntlm && channels[i].lastStatus != 401)) { + if (channels[i].authMethod != QAuthenticatorPrivate::None) { + if (!(channels[i].authMethod == QAuthenticatorPrivate::Ntlm && channels[i].lastStatus != 401)) { QAuthenticatorPrivate *priv = QAuthenticatorPrivate::getPrivate(channels[i].authenticator); if (priv && priv->method != QAuthenticatorPrivate::None) { QByteArray response = priv->calculateResponse(request.d->methodName(), request.d->uri(false)); @@ -413,8 +413,8 @@ void QHttpNetworkConnectionPrivate::createAuthorization(QAbstractSocket *socket, } // Send "Proxy-Authorization" header, but not if it's NTLM and the socket is already authenticated. - if (channels[i].proxyAuthMehtod != QAuthenticatorPrivate::None) { - if (!(channels[i].proxyAuthMehtod == QAuthenticatorPrivate::Ntlm && channels[i].lastStatus != 407)) { + if (channels[i].proxyAuthMethod != QAuthenticatorPrivate::None) { + if (!(channels[i].proxyAuthMethod == QAuthenticatorPrivate::Ntlm && channels[i].lastStatus != 407)) { QAuthenticatorPrivate *priv = QAuthenticatorPrivate::getPrivate(channels[i].proxyAuthenticator); if (priv && priv->method != QAuthenticatorPrivate::None) { QByteArray response = priv->calculateResponse(request.d->methodName(), request.d->uri(false)); diff --git a/src/network/access/qhttpnetworkconnectionchannel.cpp b/src/network/access/qhttpnetworkconnectionchannel.cpp index d6b3f94..58e2b2f 100644 --- a/src/network/access/qhttpnetworkconnectionchannel.cpp +++ b/src/network/access/qhttpnetworkconnectionchannel.cpp @@ -68,8 +68,8 @@ QHttpNetworkConnectionChannel::QHttpNetworkConnectionChannel() , lastStatus(0) , pendingEncrypt(false) , reconnectAttempts(2) - , authMehtod(QAuthenticatorPrivate::None) - , proxyAuthMehtod(QAuthenticatorPrivate::None) + , authMethod(QAuthenticatorPrivate::None) + , proxyAuthMethod(QAuthenticatorPrivate::None) #ifndef QT_NO_OPENSSL , ignoreAllSslErrors(false) #endif diff --git a/src/network/access/qhttpnetworkconnectionchannel_p.h b/src/network/access/qhttpnetworkconnectionchannel_p.h index 41a896d..2b1be2c 100644 --- a/src/network/access/qhttpnetworkconnectionchannel_p.h +++ b/src/network/access/qhttpnetworkconnectionchannel_p.h @@ -108,8 +108,8 @@ public: int lastStatus; // last status received on this channel bool pendingEncrypt; // for https (send after encrypted) int reconnectAttempts; // maximum 2 reconnection attempts - QAuthenticatorPrivate::Method authMehtod; - QAuthenticatorPrivate::Method proxyAuthMehtod; + QAuthenticatorPrivate::Method authMethod; + QAuthenticatorPrivate::Method proxyAuthMethod; QAuthenticator authenticator; QAuthenticator proxyAuthenticator; #ifndef QT_NO_OPENSSL -- cgit v0.12 From 7647fdaf9a4b526581e02fbd0e87c41a96cbfebb Mon Sep 17 00:00:00 2001 From: Markus Goetz Date: Mon, 25 Oct 2010 12:00:58 +0200 Subject: QNAM: Internal function renaming Reviewed-by: Prasanth Task-Number: QTBUG-13234 --- src/network/access/qnetworkaccessbackend.cpp | 2 +- src/network/access/qnetworkaccessmanager.cpp | 12 ++++++------ src/network/access/qnetworkaccessmanager_p.h | 6 +++--- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/network/access/qnetworkaccessbackend.cpp b/src/network/access/qnetworkaccessbackend.cpp index 60f7dc6..0a0987a 100644 --- a/src/network/access/qnetworkaccessbackend.cpp +++ b/src/network/access/qnetworkaccessbackend.cpp @@ -329,7 +329,7 @@ void QNetworkAccessBackend::authenticationRequired(QAuthenticator *authenticator void QNetworkAccessBackend::cacheCredentials(QAuthenticator *authenticator) { - manager->addCredentials(this->reply->url, authenticator); + manager->cacheCredentials(this->reply->url, authenticator); } void QNetworkAccessBackend::metaDataChanged() diff --git a/src/network/access/qnetworkaccessmanager.cpp b/src/network/access/qnetworkaccessmanager.cpp index 0d33a46..e5f4d5a 100644 --- a/src/network/access/qnetworkaccessmanager.cpp +++ b/src/network/access/qnetworkaccessmanager.cpp @@ -1122,7 +1122,7 @@ void QNetworkAccessManagerPrivate::authenticationRequired(QNetworkAccessBackend backend->reply->urlForLastAuthentication = url; emit q->authenticationRequired(backend->reply->q_func(), authenticator); - addCredentials(url, authenticator); + cacheCredentials(url, authenticator); } #ifndef QT_NO_NETWORKPROXY @@ -1139,7 +1139,7 @@ void QNetworkAccessManagerPrivate::proxyAuthenticationRequired(QNetworkAccessBac // possible solution: some tracking inside the authenticator // or a new function proxyAuthenticationSucceeded(true|false) if (proxy != backend->reply->lastProxyAuthentication) { - QNetworkAuthenticationCredential *cred = fetchCachedCredentials(proxy); + QNetworkAuthenticationCredential *cred = fetchCachedProxyCredentials(proxy); if (cred) { authenticator->setUser(cred->user); authenticator->setPassword(cred->password); @@ -1149,10 +1149,10 @@ void QNetworkAccessManagerPrivate::proxyAuthenticationRequired(QNetworkAccessBac backend->reply->lastProxyAuthentication = proxy; emit q->proxyAuthenticationRequired(proxy, authenticator); - addCredentials(proxy, authenticator); + cacheProxyCredentials(proxy, authenticator); } -void QNetworkAccessManagerPrivate::addCredentials(const QNetworkProxy &p, +void QNetworkAccessManagerPrivate::cacheProxyCredentials(const QNetworkProxy &p, const QAuthenticator *authenticator) { Q_ASSERT(authenticator); @@ -1189,7 +1189,7 @@ void QNetworkAccessManagerPrivate::addCredentials(const QNetworkProxy &p, } QNetworkAuthenticationCredential * -QNetworkAccessManagerPrivate::fetchCachedCredentials(const QNetworkProxy &p, +QNetworkAccessManagerPrivate::fetchCachedProxyCredentials(const QNetworkProxy &p, const QAuthenticator *authenticator) { QNetworkProxy proxy = p; @@ -1241,7 +1241,7 @@ QList QNetworkAccessManagerPrivate::queryProxy(const QNetworkProx } #endif -void QNetworkAccessManagerPrivate::addCredentials(const QUrl &url, +void QNetworkAccessManagerPrivate::cacheCredentials(const QUrl &url, const QAuthenticator *authenticator) { Q_ASSERT(authenticator); diff --git a/src/network/access/qnetworkaccessmanager_p.h b/src/network/access/qnetworkaccessmanager_p.h index 695842c..2c6ee10 100644 --- a/src/network/access/qnetworkaccessmanager_p.h +++ b/src/network/access/qnetworkaccessmanager_p.h @@ -91,15 +91,15 @@ public: void createCookieJar() const; void authenticationRequired(QNetworkAccessBackend *backend, QAuthenticator *authenticator); - void addCredentials(const QUrl &url, const QAuthenticator *auth); + void cacheCredentials(const QUrl &url, const QAuthenticator *auth); QNetworkAuthenticationCredential *fetchCachedCredentials(const QUrl &url, const QAuthenticator *auth = 0); #ifndef QT_NO_NETWORKPROXY void proxyAuthenticationRequired(QNetworkAccessBackend *backend, const QNetworkProxy &proxy, QAuthenticator *authenticator); - void addCredentials(const QNetworkProxy &proxy, const QAuthenticator *auth); - QNetworkAuthenticationCredential *fetchCachedCredentials(const QNetworkProxy &proxy, + void cacheProxyCredentials(const QNetworkProxy &proxy, const QAuthenticator *auth); + QNetworkAuthenticationCredential *fetchCachedProxyCredentials(const QNetworkProxy &proxy, const QAuthenticator *auth = 0); QList queryProxy(const QNetworkProxyQuery &query); #endif -- cgit v0.12 From 6765569901a12fc70be2c1921d79b377898df9ae Mon Sep 17 00:00:00 2001 From: Markus Goetz Date: Tue, 26 Oct 2010 14:19:18 +0200 Subject: QNAM HTTP: Remove Wait4AuthState Reviewed-by: Prasanth Task-Number: QTBUG-13234 --- src/network/access/qhttpnetworkconnection.cpp | 5 ----- src/network/access/qhttpnetworkconnectionchannel.cpp | 1 - src/network/access/qhttpnetworkconnectionchannel_p.h | 3 +-- 3 files changed, 1 insertion(+), 8 deletions(-) diff --git a/src/network/access/qhttpnetworkconnection.cpp b/src/network/access/qhttpnetworkconnection.cpp index b7380b5..1166a9a 100644 --- a/src/network/access/qhttpnetworkconnection.cpp +++ b/src/network/access/qhttpnetworkconnection.cpp @@ -381,11 +381,6 @@ bool QHttpNetworkConnectionPrivate::handleAuthenticateChallenge(QAbstractSocket emit channels[i].reply->finished(); // ### at this point the reply could be deleted socket->close(); - // remove pending request on the other channels - for (int j = 0; j < channelCount; ++j) { - if (j != i && channels[j].state == QHttpNetworkConnectionChannel::Wait4AuthState) - channels[j].state = QHttpNetworkConnectionChannel::IdleState; - } return true; } //resend the request diff --git a/src/network/access/qhttpnetworkconnectionchannel.cpp b/src/network/access/qhttpnetworkconnectionchannel.cpp index 58e2b2f..329b0b2 100644 --- a/src/network/access/qhttpnetworkconnectionchannel.cpp +++ b/src/network/access/qhttpnetworkconnectionchannel.cpp @@ -310,7 +310,6 @@ bool QHttpNetworkConnectionChannel::sendRequest() break; } case QHttpNetworkConnectionChannel::ReadingState: - case QHttpNetworkConnectionChannel::Wait4AuthState: // ignore _q_bytesWritten in these states // fall through default: diff --git a/src/network/access/qhttpnetworkconnectionchannel_p.h b/src/network/access/qhttpnetworkconnectionchannel_p.h index 2b1be2c..442086a 100644 --- a/src/network/access/qhttpnetworkconnectionchannel_p.h +++ b/src/network/access/qhttpnetworkconnectionchannel_p.h @@ -95,8 +95,7 @@ public: WritingState = 2, // writing the data WaitingState = 4, // waiting for reply ReadingState = 8, // reading the reply - Wait4AuthState = 0x10, // blocked for send till the current authentication slot is done - BusyState = (ConnectingState|WritingState|WaitingState|ReadingState|Wait4AuthState) + BusyState = (ConnectingState|WritingState|WaitingState|ReadingState) }; QAbstractSocket *socket; ChannelState state; -- cgit v0.12 From 300523dfba881e5464da24cf6106890f3c803cd0 Mon Sep 17 00:00:00 2001 From: Markus Goetz Date: Tue, 26 Oct 2010 15:29:44 +0200 Subject: QNAM HTTP: Use sslErrors() from QHttpNetworkReply Reviewed-by: Prasanth Task-Number: QTBUG-13234 --- src/network/access/qhttpnetworkconnection_p.h | 3 --- src/network/access/qhttpnetworkconnectionchannel.cpp | 2 +- src/network/access/qhttpnetworkreply.cpp | 5 +++++ src/network/access/qhttpnetworkreply_p.h | 2 ++ src/network/access/qnetworkaccesshttpbackend.cpp | 6 ++---- .../auto/qhttpnetworkconnection/tst_qhttpnetworkconnection.cpp | 10 ++++++---- 6 files changed, 16 insertions(+), 12 deletions(-) diff --git a/src/network/access/qhttpnetworkconnection_p.h b/src/network/access/qhttpnetworkconnection_p.h index 875c978..e20c795 100644 --- a/src/network/access/qhttpnetworkconnection_p.h +++ b/src/network/access/qhttpnetworkconnection_p.h @@ -120,9 +120,6 @@ public: void setSslConfiguration(const QSslConfiguration &config); void ignoreSslErrors(int channel = -1); void ignoreSslErrors(const QList &errors, int channel = -1); - -Q_SIGNALS: - void sslErrors(const QList &errors); #endif Q_SIGNALS: diff --git a/src/network/access/qhttpnetworkconnectionchannel.cpp b/src/network/access/qhttpnetworkconnectionchannel.cpp index 329b0b2..9c504ba 100644 --- a/src/network/access/qhttpnetworkconnectionchannel.cpp +++ b/src/network/access/qhttpnetworkconnectionchannel.cpp @@ -1037,7 +1037,7 @@ void QHttpNetworkConnectionChannel::_q_sslErrors(const QList &errors) // Also pause the connection because socket notifiers may fire while an user // dialog is displaying connection->d_func()->pauseConnection(); - emit connection->sslErrors(errors); + emit reply->sslErrors(errors); connection->d_func()->resumeConnection(); } diff --git a/src/network/access/qhttpnetworkreply.cpp b/src/network/access/qhttpnetworkreply.cpp index 108ba8a..e4eb7c4 100644 --- a/src/network/access/qhttpnetworkreply.cpp +++ b/src/network/access/qhttpnetworkreply.cpp @@ -205,6 +205,11 @@ bool QHttpNetworkReply::isPipeliningUsed() const return d_func()->pipeliningUsed; } +QHttpNetworkConnection* QHttpNetworkReply::connection() +{ + return d_func()->connection; +} + QHttpNetworkReplyPrivate::QHttpNetworkReplyPrivate(const QUrl &newUrl) : QHttpNetworkHeaderPrivate(newUrl), state(NothingDoneState), statusCode(100), diff --git a/src/network/access/qhttpnetworkreply_p.h b/src/network/access/qhttpnetworkreply_p.h index 4011c78..7cfd8b2 100644 --- a/src/network/access/qhttpnetworkreply_p.h +++ b/src/network/access/qhttpnetworkreply_p.h @@ -132,6 +132,8 @@ public: bool isPipeliningUsed() const; + QHttpNetworkConnection* connection(); + #ifndef QT_NO_OPENSSL QSslConfiguration sslConfiguration() const; void setSslConfiguration(const QSslConfiguration &config); diff --git a/src/network/access/qnetworkaccesshttpbackend.cpp b/src/network/access/qnetworkaccesshttpbackend.cpp index 2af4987..c425600 100644 --- a/src/network/access/qnetworkaccesshttpbackend.cpp +++ b/src/network/access/qnetworkaccesshttpbackend.cpp @@ -350,10 +350,6 @@ void QNetworkAccessHttpBackend::setupConnection() SLOT(httpCacheCredentials(QHttpNetworkRequest,QAuthenticator*))); connect(http, SIGNAL(error(QNetworkReply::NetworkError,QString)), SLOT(httpError(QNetworkReply::NetworkError,QString))); -#ifndef QT_NO_OPENSSL - connect(http, SIGNAL(sslErrors(QList)), - SLOT(sslErrors(QList))); -#endif } /* @@ -593,6 +589,8 @@ void QNetworkAccessHttpBackend::postRequest() if (pendingIgnoreAllSslErrors) httpReply->ignoreSslErrors(); httpReply->ignoreSslErrors(pendingIgnoreSslErrorsList); + connect(httpReply, SIGNAL(sslErrors(QList)), + SLOT(sslErrors(QList))); #endif connect(httpReply, SIGNAL(readyRead()), SLOT(replyReadyRead())); diff --git a/tests/auto/qhttpnetworkconnection/tst_qhttpnetworkconnection.cpp b/tests/auto/qhttpnetworkconnection/tst_qhttpnetworkconnection.cpp index c0f503b..ecfd462 100644 --- a/tests/auto/qhttpnetworkconnection/tst_qhttpnetworkconnection.cpp +++ b/tests/auto/qhttpnetworkconnection/tst_qhttpnetworkconnection.cpp @@ -668,8 +668,10 @@ void tst_QHttpNetworkConnection::sslErrors(const QList &errors) { Q_UNUSED(errors) - QHttpNetworkConnection *connection = qobject_cast(sender()); - if (connection) { + QHttpNetworkReply *reply = qobject_cast(sender()); + if (reply) { + QHttpNetworkConnection *connection = reply->connection(); + QVariant val = connection->property("ignoreFromSignal"); if (val.toBool()) connection->ignoreSslErrors(); @@ -716,12 +718,12 @@ void tst_QHttpNetworkConnection::ignoresslerror() if (ignoreInit) connection.ignoreSslErrors(); QCOMPARE(connection.isEncrypted(), encrypt); - connect(&connection, SIGNAL(sslErrors(const QList&)), - SLOT(sslErrors(const QList&))); connection.setProperty("ignoreFromSignal", ignoreFromSignal); QHttpNetworkRequest request(protocol + host + path); QHttpNetworkReply *reply = connection.sendRequest(request); + connect(reply, SIGNAL(sslErrors(const QList&)), + SLOT(sslErrors(const QList&))); finishedWithErrorCalled = false; -- cgit v0.12 From 3b87e4639edb2c7050c5ae74fa8280fd120b8de1 Mon Sep 17 00:00:00 2001 From: Markus Goetz Date: Tue, 26 Oct 2010 15:35:10 +0200 Subject: QNAM HTTP: Move cacheCredentials() to QHttpNetworkReply Reviewed-by: Prasanth Task-Number: QTBUG-13234 --- src/network/access/qhttpnetworkconnection_p.h | 2 -- src/network/access/qhttpnetworkconnectionchannel.cpp | 2 +- src/network/access/qhttpnetworkreply_p.h | 1 + src/network/access/qnetworkaccesshttpbackend.cpp | 4 ++-- 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/network/access/qhttpnetworkconnection_p.h b/src/network/access/qhttpnetworkconnection_p.h index e20c795..f8c4bb4 100644 --- a/src/network/access/qhttpnetworkconnection_p.h +++ b/src/network/access/qhttpnetworkconnection_p.h @@ -130,8 +130,6 @@ Q_SIGNALS: #endif void authenticationRequired(const QHttpNetworkReply*, const QHttpNetworkRequest &request, QAuthenticator *authenticator, const QHttpNetworkConnection *connection = 0); - void cacheCredentials(const QHttpNetworkRequest &request, QAuthenticator *authenticator, - const QHttpNetworkConnection *connection = 0); void error(QNetworkReply::NetworkError errorCode, const QString &detail = QString()); private: diff --git a/src/network/access/qhttpnetworkconnectionchannel.cpp b/src/network/access/qhttpnetworkconnectionchannel.cpp index 9c504ba..52a8e72 100644 --- a/src/network/access/qhttpnetworkconnectionchannel.cpp +++ b/src/network/access/qhttpnetworkconnectionchannel.cpp @@ -190,7 +190,7 @@ bool QHttpNetworkConnectionChannel::sendRequest() || (!url.password().isEmpty() && url.password() != auth.password())) { auth.setUser(url.userName()); auth.setPassword(url.password()); - emit connection->cacheCredentials(request, &auth, connection); + emit reply->cacheCredentials(request, &auth); connection->d_func()->copyCredentials(connection->d_func()->indexOf(socket), &auth, false); } // clear the userinfo, since we use the same request for resending diff --git a/src/network/access/qhttpnetworkreply_p.h b/src/network/access/qhttpnetworkreply_p.h index 7cfd8b2..79966fd 100644 --- a/src/network/access/qhttpnetworkreply_p.h +++ b/src/network/access/qhttpnetworkreply_p.h @@ -151,6 +151,7 @@ Q_SIGNALS: void headerChanged(); void dataReadProgress(int done, int total); void dataSendProgress(qint64 done, qint64 total); + void cacheCredentials(const QHttpNetworkRequest &request, QAuthenticator *authenticator); private: Q_DECLARE_PRIVATE(QHttpNetworkReply) diff --git a/src/network/access/qnetworkaccesshttpbackend.cpp b/src/network/access/qnetworkaccesshttpbackend.cpp index c425600..3bad2fe 100644 --- a/src/network/access/qnetworkaccesshttpbackend.cpp +++ b/src/network/access/qnetworkaccesshttpbackend.cpp @@ -346,8 +346,6 @@ void QNetworkAccessHttpBackend::setupConnection() #endif connect(http, SIGNAL(authenticationRequired(const QHttpNetworkReply*, QHttpNetworkRequest,QAuthenticator*,const QHttpNetworkConnection*)), SLOT(httpAuthenticationRequired(const QHttpNetworkReply*, QHttpNetworkRequest,QAuthenticator*))); - connect(http, SIGNAL(cacheCredentials(QHttpNetworkRequest,QAuthenticator*)), - SLOT(httpCacheCredentials(QHttpNetworkRequest,QAuthenticator*))); connect(http, SIGNAL(error(QNetworkReply::NetworkError,QString)), SLOT(httpError(QNetworkReply::NetworkError,QString))); } @@ -598,6 +596,8 @@ void QNetworkAccessHttpBackend::postRequest() connect(httpReply, SIGNAL(finishedWithError(QNetworkReply::NetworkError,QString)), SLOT(httpError(QNetworkReply::NetworkError,QString))); connect(httpReply, SIGNAL(headerChanged()), SLOT(replyHeaderChanged())); + connect(httpReply, SIGNAL(cacheCredentials(QHttpNetworkRequest,QAuthenticator*)), + SLOT(httpCacheCredentials(QHttpNetworkRequest,QAuthenticator*))); } void QNetworkAccessHttpBackend::invalidateCache() -- cgit v0.12 From fb404765a5af559598dc5b3906e45d8c5e48884b Mon Sep 17 00:00:00 2001 From: Markus Goetz Date: Tue, 26 Oct 2010 15:48:42 +0200 Subject: QNAM HTTP: Move proxyAuthenticationRequired() to QHttpNetworkReply Reviewed-by: Prasanth Task-Number: QTBUG-13234 --- src/network/access/qhttpnetworkconnection.cpp | 5 ++--- src/network/access/qhttpnetworkconnection_p.h | 5 ----- src/network/access/qhttpnetworkreply_p.h | 4 +++- src/network/access/qnetworkaccesshttpbackend.cpp | 8 ++++---- 4 files changed, 9 insertions(+), 13 deletions(-) diff --git a/src/network/access/qhttpnetworkconnection.cpp b/src/network/access/qhttpnetworkconnection.cpp index 1166a9a..f266322 100644 --- a/src/network/access/qhttpnetworkconnection.cpp +++ b/src/network/access/qhttpnetworkconnection.cpp @@ -354,7 +354,7 @@ bool QHttpNetworkConnectionPrivate::handleAuthenticateChallenge(QAbstractSocket emit q->authenticationRequired(reply, reply->request(), auth, q); #ifndef QT_NO_NETWORKPROXY } else { - emit q->proxyAuthenticationRequired(networkProxy, auth, q); + emit reply->proxyAuthenticationRequired(networkProxy, auth); #endif } resumeConnection(); @@ -963,11 +963,10 @@ void QHttpNetworkConnection::ignoreSslErrors(const QList &errors, int // e.g. it is for SOCKS proxies which require authentication. void QHttpNetworkConnectionPrivate::emitProxyAuthenticationRequired(const QHttpNetworkConnectionChannel *chan, const QNetworkProxy &proxy, QAuthenticator* auth) { - Q_Q(QHttpNetworkConnection); // Also pause the connection because socket notifiers may fire while an user // dialog is displaying pauseConnection(); - emit q->proxyAuthenticationRequired(proxy, auth, q); + emit chan->reply->proxyAuthenticationRequired(proxy, auth); resumeConnection(); int i = indexOf(chan->socket); copyCredentials(i, auth, true); diff --git a/src/network/access/qhttpnetworkconnection_p.h b/src/network/access/qhttpnetworkconnection_p.h index f8c4bb4..af33bf9 100644 --- a/src/network/access/qhttpnetworkconnection_p.h +++ b/src/network/access/qhttpnetworkconnection_p.h @@ -123,11 +123,6 @@ public: #endif Q_SIGNALS: -#ifndef QT_NO_NETWORKPROXY - //cannot be used with queued connection. - void proxyAuthenticationRequired(const QNetworkProxy &proxy, QAuthenticator *authenticator, - const QHttpNetworkConnection *connection = 0); -#endif void authenticationRequired(const QHttpNetworkReply*, const QHttpNetworkRequest &request, QAuthenticator *authenticator, const QHttpNetworkConnection *connection = 0); void error(QNetworkReply::NetworkError errorCode, const QString &detail = QString()); diff --git a/src/network/access/qhttpnetworkreply_p.h b/src/network/access/qhttpnetworkreply_p.h index 79966fd..b4a14f9 100644 --- a/src/network/access/qhttpnetworkreply_p.h +++ b/src/network/access/qhttpnetworkreply_p.h @@ -152,7 +152,9 @@ Q_SIGNALS: void dataReadProgress(int done, int total); void dataSendProgress(qint64 done, qint64 total); void cacheCredentials(const QHttpNetworkRequest &request, QAuthenticator *authenticator); - +#ifndef QT_NO_NETWORKPROXY + void proxyAuthenticationRequired(const QNetworkProxy &proxy, QAuthenticator *authenticator); +#endif private: Q_DECLARE_PRIVATE(QHttpNetworkReply) friend class QHttpNetworkConnection; diff --git a/src/network/access/qnetworkaccesshttpbackend.cpp b/src/network/access/qnetworkaccesshttpbackend.cpp index 3bad2fe..3611e77 100644 --- a/src/network/access/qnetworkaccesshttpbackend.cpp +++ b/src/network/access/qnetworkaccesshttpbackend.cpp @@ -340,10 +340,6 @@ void QNetworkAccessHttpBackend::finished() void QNetworkAccessHttpBackend::setupConnection() { -#ifndef QT_NO_NETWORKPROXY - connect(http, SIGNAL(proxyAuthenticationRequired(QNetworkProxy,QAuthenticator*)), - SLOT(proxyAuthenticationRequired(QNetworkProxy,QAuthenticator*))); -#endif connect(http, SIGNAL(authenticationRequired(const QHttpNetworkReply*, QHttpNetworkRequest,QAuthenticator*,const QHttpNetworkConnection*)), SLOT(httpAuthenticationRequired(const QHttpNetworkReply*, QHttpNetworkRequest,QAuthenticator*))); connect(http, SIGNAL(error(QNetworkReply::NetworkError,QString)), @@ -598,6 +594,10 @@ void QNetworkAccessHttpBackend::postRequest() connect(httpReply, SIGNAL(headerChanged()), SLOT(replyHeaderChanged())); connect(httpReply, SIGNAL(cacheCredentials(QHttpNetworkRequest,QAuthenticator*)), SLOT(httpCacheCredentials(QHttpNetworkRequest,QAuthenticator*))); +#ifndef QT_NO_NETWORKPROXY + connect(httpReply, SIGNAL(proxyAuthenticationRequired(QNetworkProxy,QAuthenticator*)), + SLOT(proxyAuthenticationRequired(QNetworkProxy,QAuthenticator*))); +#endif } void QNetworkAccessHttpBackend::invalidateCache() -- cgit v0.12 From 3d7e7b4595059c69428022e52b63b10edbe81b0f Mon Sep 17 00:00:00 2001 From: Markus Goetz Date: Tue, 26 Oct 2010 17:47:43 +0200 Subject: QNAM HTTP: Move authenticationRequired() to QHttpNetworkReply Reviewed-by: Prasanth Task-Number: QTBUG-13234 --- src/network/access/qhttpnetworkconnection.cpp | 2 +- src/network/access/qhttpnetworkconnection_p.h | 2 -- src/network/access/qhttpnetworkreply_p.h | 1 + src/network/access/qnetworkaccesshttpbackend.cpp | 11 ++++------- src/network/access/qnetworkaccesshttpbackend_p.h | 2 +- .../tst_qhttpnetworkconnection.cpp | 18 +++++++++--------- 6 files changed, 16 insertions(+), 20 deletions(-) diff --git a/src/network/access/qhttpnetworkconnection.cpp b/src/network/access/qhttpnetworkconnection.cpp index f266322..1afca0b 100644 --- a/src/network/access/qhttpnetworkconnection.cpp +++ b/src/network/access/qhttpnetworkconnection.cpp @@ -351,7 +351,7 @@ bool QHttpNetworkConnectionPrivate::handleAuthenticateChallenge(QAbstractSocket if (priv->phase == QAuthenticatorPrivate::Done) { pauseConnection(); if (!isProxy) { - emit q->authenticationRequired(reply, reply->request(), auth, q); + emit reply->authenticationRequired(reply->request(), auth); #ifndef QT_NO_NETWORKPROXY } else { emit reply->proxyAuthenticationRequired(networkProxy, auth); diff --git a/src/network/access/qhttpnetworkconnection_p.h b/src/network/access/qhttpnetworkconnection_p.h index af33bf9..8d18a7c 100644 --- a/src/network/access/qhttpnetworkconnection_p.h +++ b/src/network/access/qhttpnetworkconnection_p.h @@ -123,8 +123,6 @@ public: #endif Q_SIGNALS: - void authenticationRequired(const QHttpNetworkReply*, const QHttpNetworkRequest &request, QAuthenticator *authenticator, - const QHttpNetworkConnection *connection = 0); void error(QNetworkReply::NetworkError errorCode, const QString &detail = QString()); private: diff --git a/src/network/access/qhttpnetworkreply_p.h b/src/network/access/qhttpnetworkreply_p.h index b4a14f9..3f79d81 100644 --- a/src/network/access/qhttpnetworkreply_p.h +++ b/src/network/access/qhttpnetworkreply_p.h @@ -155,6 +155,7 @@ Q_SIGNALS: #ifndef QT_NO_NETWORKPROXY void proxyAuthenticationRequired(const QNetworkProxy &proxy, QAuthenticator *authenticator); #endif + void authenticationRequired(const QHttpNetworkRequest &request, QAuthenticator *authenticator); private: Q_DECLARE_PRIVATE(QHttpNetworkReply) friend class QHttpNetworkConnection; diff --git a/src/network/access/qnetworkaccesshttpbackend.cpp b/src/network/access/qnetworkaccesshttpbackend.cpp index 3611e77..3a854fe 100644 --- a/src/network/access/qnetworkaccesshttpbackend.cpp +++ b/src/network/access/qnetworkaccesshttpbackend.cpp @@ -340,8 +340,6 @@ void QNetworkAccessHttpBackend::finished() void QNetworkAccessHttpBackend::setupConnection() { - connect(http, SIGNAL(authenticationRequired(const QHttpNetworkReply*, QHttpNetworkRequest,QAuthenticator*,const QHttpNetworkConnection*)), - SLOT(httpAuthenticationRequired(const QHttpNetworkReply*, QHttpNetworkRequest,QAuthenticator*))); connect(http, SIGNAL(error(QNetworkReply::NetworkError,QString)), SLOT(httpError(QNetworkReply::NetworkError,QString))); } @@ -598,6 +596,8 @@ void QNetworkAccessHttpBackend::postRequest() connect(httpReply, SIGNAL(proxyAuthenticationRequired(QNetworkProxy,QAuthenticator*)), SLOT(proxyAuthenticationRequired(QNetworkProxy,QAuthenticator*))); #endif + connect(httpReply, SIGNAL(authenticationRequired(const QHttpNetworkRequest,QAuthenticator*)), + SLOT(httpAuthenticationRequired(const QHttpNetworkRequest,QAuthenticator*))); } void QNetworkAccessHttpBackend::invalidateCache() @@ -860,13 +860,10 @@ void QNetworkAccessHttpBackend::replyHeaderChanged() metaDataChanged(); } -void QNetworkAccessHttpBackend::httpAuthenticationRequired(const QHttpNetworkReply *reply, - const QHttpNetworkRequest &, +void QNetworkAccessHttpBackend::httpAuthenticationRequired(const QHttpNetworkRequest &, QAuthenticator *auth) { - // Only process this signal when it is for the QHttpNetworkReply that we actually have - if (reply == this->httpReply) - authenticationRequired(auth); + authenticationRequired(auth); } void QNetworkAccessHttpBackend::httpCacheCredentials(const QHttpNetworkRequest &, diff --git a/src/network/access/qnetworkaccesshttpbackend_p.h b/src/network/access/qnetworkaccesshttpbackend_p.h index f06f364..c4c88ae 100644 --- a/src/network/access/qnetworkaccesshttpbackend_p.h +++ b/src/network/access/qnetworkaccesshttpbackend_p.h @@ -104,7 +104,7 @@ private slots: void replyReadyRead(); void replyFinished(); void replyHeaderChanged(); - void httpAuthenticationRequired(const QHttpNetworkReply*, const QHttpNetworkRequest &request, QAuthenticator *auth); + void httpAuthenticationRequired(const QHttpNetworkRequest &request, QAuthenticator *auth); void httpCacheCredentials(const QHttpNetworkRequest &request, QAuthenticator *auth); void httpError(QNetworkReply::NetworkError error, const QString &errorString); bool sendCacheContents(const QNetworkCacheMetaData &metaData); diff --git a/tests/auto/qhttpnetworkconnection/tst_qhttpnetworkconnection.cpp b/tests/auto/qhttpnetworkconnection/tst_qhttpnetworkconnection.cpp index ecfd462..0956b57 100644 --- a/tests/auto/qhttpnetworkconnection/tst_qhttpnetworkconnection.cpp +++ b/tests/auto/qhttpnetworkconnection/tst_qhttpnetworkconnection.cpp @@ -57,7 +57,7 @@ public: public Q_SLOTS: void finishedReply(); void finishedWithError(QNetworkReply::NetworkError errorCode, const QString &detail); - void challenge401(const QHttpNetworkReply*, const QHttpNetworkRequest &request, QAuthenticator *authenticator, const QHttpNetworkConnection *connection); + void challenge401(const QHttpNetworkRequest &request, QAuthenticator *authenticator); #ifndef QT_NO_OPENSSL void sslErrors(const QList &errors); #endif @@ -495,15 +495,15 @@ void tst_QHttpNetworkConnection::_connect() QVERIFY(false); } -void tst_QHttpNetworkConnection::challenge401(const QHttpNetworkReply*, const QHttpNetworkRequest &request, - QAuthenticator *authenticator, - const QHttpNetworkConnection *connection) +void tst_QHttpNetworkConnection::challenge401(const QHttpNetworkRequest &request, + QAuthenticator *authenticator) { Q_UNUSED(request) - Q_UNUSED(connection) - QHttpNetworkConnection *c = qobject_cast(sender()); - if (connection) { + QHttpNetworkReply *reply = qobject_cast(sender()); + if (reply) { + QHttpNetworkConnection *c = reply->connection(); + QVariant val = c->property("setCredentials"); if (val.toBool()) { QVariant user = c->property("username"); @@ -552,14 +552,14 @@ void tst_QHttpNetworkConnection::get401() if (encrypt) connection.enableEncryption(); QCOMPARE(connection.isEncrypted(), encrypt); - connect(&connection, SIGNAL(authenticationRequired(const QHttpNetworkReply*, const QHttpNetworkRequest&, QAuthenticator *, const QHttpNetworkConnection*)), - SLOT(challenge401(const QHttpNetworkReply*, const QHttpNetworkRequest&, QAuthenticator *, const QHttpNetworkConnection*))); connection.setProperty("setCredentials", setCredentials); connection.setProperty("username", username); connection.setProperty("password", password); QHttpNetworkRequest request(protocol + host + path); QHttpNetworkReply *reply = connection.sendRequest(request); + connect(reply, SIGNAL(authenticationRequired(const QHttpNetworkRequest&, QAuthenticator *)), + SLOT(challenge401(const QHttpNetworkRequest&, QAuthenticator *))); finishedCalled = false; finishedWithErrorCalled = false; -- cgit v0.12 From a754c657db2d812911f278299c64001f37c2aae8 Mon Sep 17 00:00:00 2001 From: Markus Goetz Date: Tue, 26 Oct 2010 17:53:43 +0200 Subject: QNAM HTTP: Remove unused code Reviewed-by: Prasanth Task-Number: QTBUG-13234 --- src/network/access/qhttpnetworkconnection.cpp | 15 --------------- src/network/access/qhttpnetworkconnection_p.h | 4 ---- src/network/access/qnetworkaccesshttpbackend.cpp | 23 ----------------------- 3 files changed, 42 deletions(-) diff --git a/src/network/access/qhttpnetworkconnection.cpp b/src/network/access/qhttpnetworkconnection.cpp index 1afca0b..bf02543 100644 --- a/src/network/access/qhttpnetworkconnection.cpp +++ b/src/network/access/qhttpnetworkconnection.cpp @@ -856,21 +856,6 @@ bool QHttpNetworkConnection::isEncrypted() const return d->encrypt; } -void QHttpNetworkConnection::setProxyAuthentication(QAuthenticator *authenticator) -{ - Q_D(QHttpNetworkConnection); - for (int i = 0; i < d->channelCount; ++i) - d->channels[i].proxyAuthenticator = *authenticator; -} - -void QHttpNetworkConnection::setAuthentication(const QString &domain, QAuthenticator *authenticator) -{ - Q_UNUSED(domain); // ### domain ? - Q_D(QHttpNetworkConnection); - for (int i = 0; i < d->channelCount; ++i) - d->channels[i].authenticator = *authenticator; -} - #ifndef QT_NO_NETWORKPROXY void QHttpNetworkConnection::setCacheProxy(const QNetworkProxy &networkProxy) { diff --git a/src/network/access/qhttpnetworkconnection_p.h b/src/network/access/qhttpnetworkconnection_p.h index 8d18a7c..f55937d 100644 --- a/src/network/access/qhttpnetworkconnection_p.h +++ b/src/network/access/qhttpnetworkconnection_p.h @@ -112,10 +112,6 @@ public: void enableEncryption(); bool isEncrypted() const; - //authentication parameters - void setProxyAuthentication(QAuthenticator *authenticator); - void setAuthentication(const QString &domain, QAuthenticator *authenticator); - #ifndef QT_NO_OPENSSL void setSslConfiguration(const QSslConfiguration &config); void ignoreSslErrors(int channel = -1); diff --git a/src/network/access/qnetworkaccesshttpbackend.cpp b/src/network/access/qnetworkaccesshttpbackend.cpp index 3a854fe..ec10d34 100644 --- a/src/network/access/qnetworkaccesshttpbackend.cpp +++ b/src/network/access/qnetworkaccesshttpbackend.cpp @@ -878,29 +878,6 @@ void QNetworkAccessHttpBackend::httpError(QNetworkReply::NetworkError errorCode, #if defined(QNETWORKACCESSHTTPBACKEND_DEBUG) qDebug() << "http error!" << errorCode << errorString; #endif -#if 0 - static const QNetworkReply::NetworkError conversionTable[] = { - QNetworkReply::ConnectionRefusedError, - QNetworkReply::RemoteHostClosedError, - QNetworkReply::HostNotFoundError, - QNetworkReply::UnknownNetworkError, // SocketAccessError - QNetworkReply::UnknownNetworkError, // SocketResourceError - QNetworkReply::TimeoutError, // SocketTimeoutError - QNetworkReply::UnknownNetworkError, // DatagramTooLargeError - QNetworkReply::UnknownNetworkError, // NetworkError - QNetworkReply::UnknownNetworkError, // AddressInUseError - QNetworkReply::UnknownNetworkError, // SocketAddressNotAvailableError - QNetworkReply::UnknownNetworkError, // UnsupportedSocketOperationError - QNetworkReply::UnknownNetworkError, // UnfinishedSocketOperationError - QNetworkReply::ProxyAuthenticationRequiredError - }; - QNetworkReply::NetworkError code; - if (int(errorCode) >= 0 && - uint(errorCode) < (sizeof conversionTable / sizeof conversionTable[0])) - code = conversionTable[errorCode]; - else - code = QNetworkReply::UnknownNetworkError; -#endif error(errorCode, errorString); finished(); } -- cgit v0.12 From be18016694c57fef508aa4715f5b8f9bbf21e5ac Mon Sep 17 00:00:00 2001 From: Markus Goetz Date: Tue, 26 Oct 2010 18:02:10 +0200 Subject: QNAM HTTP: Remove enableEncryption() Reviewed-by: Prasanth Task-Number: QTBUG-13234 --- src/network/access/qhttpnetworkconnection.cpp | 6 ----- src/network/access/qhttpnetworkconnection_p.h | 2 -- .../tst_qhttpnetworkconnection.cpp | 26 +++++----------------- 3 files changed, 5 insertions(+), 29 deletions(-) diff --git a/src/network/access/qhttpnetworkconnection.cpp b/src/network/access/qhttpnetworkconnection.cpp index bf02543..3acaaff 100644 --- a/src/network/access/qhttpnetworkconnection.cpp +++ b/src/network/access/qhttpnetworkconnection.cpp @@ -844,12 +844,6 @@ QHttpNetworkReply* QHttpNetworkConnection::sendRequest(const QHttpNetworkRequest return d->queueRequest(request); } -void QHttpNetworkConnection::enableEncryption() -{ - Q_D(QHttpNetworkConnection); - d->encrypt = true; -} - bool QHttpNetworkConnection::isEncrypted() const { Q_D(const QHttpNetworkConnection); diff --git a/src/network/access/qhttpnetworkconnection_p.h b/src/network/access/qhttpnetworkconnection_p.h index f55937d..5d5caa6 100644 --- a/src/network/access/qhttpnetworkconnection_p.h +++ b/src/network/access/qhttpnetworkconnection_p.h @@ -108,8 +108,6 @@ public: QNetworkProxy transparentProxy() const; #endif - //enable encryption - void enableEncryption(); bool isEncrypted() const; #ifndef QT_NO_OPENSSL diff --git a/tests/auto/qhttpnetworkconnection/tst_qhttpnetworkconnection.cpp b/tests/auto/qhttpnetworkconnection/tst_qhttpnetworkconnection.cpp index 0956b57..29fe2fb 100644 --- a/tests/auto/qhttpnetworkconnection/tst_qhttpnetworkconnection.cpp +++ b/tests/auto/qhttpnetworkconnection/tst_qhttpnetworkconnection.cpp @@ -175,11 +175,9 @@ void tst_QHttpNetworkConnection::head() QFETCH(QString, statusString); QFETCH(int, contentLength); - QHttpNetworkConnection connection(host); + QHttpNetworkConnection connection(host, port, encrypt); QCOMPARE(connection.port(), port); QCOMPARE(connection.hostName(), host); - if (encrypt) - connection.enableEncryption(); QCOMPARE(connection.isEncrypted(), encrypt); QHttpNetworkRequest request(protocol + host + path, QHttpNetworkRequest::Head); @@ -235,11 +233,9 @@ void tst_QHttpNetworkConnection::get() QFETCH(int, contentLength); QFETCH(int, downloadSize); - QHttpNetworkConnection connection(host); + QHttpNetworkConnection connection(host, port, encrypt); QCOMPARE(connection.port(), port); QCOMPARE(connection.hostName(), host); - if (encrypt) - connection.enableEncryption(); QCOMPARE(connection.isEncrypted(), encrypt); QHttpNetworkRequest request(protocol + host + path); @@ -315,11 +311,9 @@ void tst_QHttpNetworkConnection::put() QFETCH(QString, data); QFETCH(bool, succeed); - QHttpNetworkConnection connection(host); + QHttpNetworkConnection connection(host, port, encrypt); QCOMPARE(connection.port(), port); QCOMPARE(connection.hostName(), host); - if (encrypt) - connection.enableEncryption(); QCOMPARE(connection.isEncrypted(), encrypt); QHttpNetworkRequest request(protocol + host + path, QHttpNetworkRequest::Put); @@ -407,11 +401,9 @@ void tst_QHttpNetworkConnection::post() QFETCH(int, contentLength); QFETCH(int, downloadSize); - QHttpNetworkConnection connection(host); + QHttpNetworkConnection connection(host, port, encrypt); QCOMPARE(connection.port(), port); QCOMPARE(connection.hostName(), host); - if (encrypt) - connection.enableEncryption(); QCOMPARE(connection.isEncrypted(), encrypt); QHttpNetworkRequest request(protocol + host + path, QHttpNetworkRequest::Post); @@ -549,8 +541,6 @@ void tst_QHttpNetworkConnection::get401() QHttpNetworkConnection connection(host, port, encrypt); QCOMPARE(connection.port(), port); QCOMPARE(connection.hostName(), host); - if (encrypt) - connection.enableEncryption(); QCOMPARE(connection.isEncrypted(), encrypt); connection.setProperty("setCredentials", setCredentials); connection.setProperty("username", username); @@ -618,11 +608,9 @@ void tst_QHttpNetworkConnection::compression() QFETCH(bool, autoCompress); QFETCH(QString, contentCoding); - QHttpNetworkConnection connection(host); + QHttpNetworkConnection connection(host, port, encrypt); QCOMPARE(connection.port(), port); QCOMPARE(connection.hostName(), host); - if (encrypt) - connection.enableEncryption(); QCOMPARE(connection.isEncrypted(), encrypt); QHttpNetworkRequest request(protocol + host + path); @@ -713,8 +701,6 @@ void tst_QHttpNetworkConnection::ignoresslerror() QHttpNetworkConnection connection(host, port, encrypt); QCOMPARE(connection.port(), port); QCOMPARE(connection.hostName(), host); - if (encrypt) - connection.enableEncryption(); if (ignoreInit) connection.ignoreSslErrors(); QCOMPARE(connection.isEncrypted(), encrypt); @@ -771,8 +757,6 @@ void tst_QHttpNetworkConnection::nossl() QHttpNetworkConnection connection(host, port, encrypt); QCOMPARE(connection.port(), port); QCOMPARE(connection.hostName(), host); - if (encrypt) - connection.enableEncryption(); QHttpNetworkRequest request(protocol + host + path); QHttpNetworkReply *reply = connection.sendRequest(request); -- cgit v0.12 From b5d9dbf28b78aa17bfb70aa2e5fd3da99fe53ff0 Mon Sep 17 00:00:00 2001 From: Markus Goetz Date: Wed, 27 Oct 2010 14:06:28 +0200 Subject: QNAM HTTP: Remove the error() of QHttpNetworkConnection Removed the distinction between reply error and connection error. The QNetworkAccessManager was treating them the same way anyway. Reviewed-by: Prasanth Task-Number: QTBUG-13234 --- src/network/access/qhttpnetworkconnection.cpp | 3 +-- src/network/access/qhttpnetworkconnection_p.h | 3 --- .../access/qhttpnetworkconnectionchannel.cpp | 24 ++++++++-------------- src/network/access/qnetworkaccesshttpbackend.cpp | 7 ------- src/network/access/qnetworkaccesshttpbackend_p.h | 1 - .../tst_qhttpnetworkconnection.cpp | 2 -- 6 files changed, 9 insertions(+), 31 deletions(-) diff --git a/src/network/access/qhttpnetworkconnection.cpp b/src/network/access/qhttpnetworkconnection.cpp index 3acaaff..92f8af7 100644 --- a/src/network/access/qhttpnetworkconnection.cpp +++ b/src/network/access/qhttpnetworkconnection.cpp @@ -377,8 +377,7 @@ bool QHttpNetworkConnectionPrivate::handleAuthenticateChallenge(QAbstractSocket ? QNetworkReply::ProxyAuthenticationRequiredError : QNetworkReply::AuthenticationRequiredError; reply->d_func()->errorString = errorDetail(errorCode, socket); - emit q->error(errorCode, reply->d_func()->errorString); - emit channels[i].reply->finished(); + emit reply->finishedWithError(errorCode, reply->d_func()->errorString); // ### at this point the reply could be deleted socket->close(); return true; diff --git a/src/network/access/qhttpnetworkconnection_p.h b/src/network/access/qhttpnetworkconnection_p.h index 5d5caa6..8461426c 100644 --- a/src/network/access/qhttpnetworkconnection_p.h +++ b/src/network/access/qhttpnetworkconnection_p.h @@ -116,9 +116,6 @@ public: void ignoreSslErrors(const QList &errors, int channel = -1); #endif -Q_SIGNALS: - void error(QNetworkReply::NetworkError errorCode, const QString &detail = QString()); - private: Q_DECLARE_PRIVATE(QHttpNetworkConnection) Q_DISABLE_COPY(QHttpNetworkConnection) diff --git a/src/network/access/qhttpnetworkconnectionchannel.cpp b/src/network/access/qhttpnetworkconnectionchannel.cpp index 52a8e72..4e5de53 100644 --- a/src/network/access/qhttpnetworkconnectionchannel.cpp +++ b/src/network/access/qhttpnetworkconnectionchannel.cpp @@ -797,8 +797,7 @@ void QHttpNetworkConnectionChannel::handleStatus() ? QNetworkReply::ProxyAuthenticationRequiredError : QNetworkReply::AuthenticationRequiredError; reply->d_func()->errorString = connection->d_func()->errorDetail(errorCode, socket); - emit connection->error(errorCode, reply->d_func()->errorString); - emit reply->finished(); + emit reply->finishedWithError(errorCode, reply->d_func()->errorString); } break; default: @@ -945,7 +944,6 @@ void QHttpNetworkConnectionChannel::_q_error(QAbstractSocket::SocketError socket { if (!socket) return; - bool send2Reply = false; QNetworkReply::NetworkError errorCode = QNetworkReply::UnknownNetworkError; switch (socketError) { @@ -963,7 +961,6 @@ void QHttpNetworkConnectionChannel::_q_error(QAbstractSocket::SocketError socket closeAndResendCurrentRequest(); return; } else { - send2Reply = true; errorCode = QNetworkReply::RemoteHostClosedError; } } else { @@ -976,7 +973,6 @@ void QHttpNetworkConnectionChannel::_q_error(QAbstractSocket::SocketError socket closeAndResendCurrentRequest(); return; } - send2Reply = true; errorCode = QNetworkReply::TimeoutError; break; case QAbstractSocket::ProxyAuthenticationRequiredError: @@ -992,18 +988,14 @@ void QHttpNetworkConnectionChannel::_q_error(QAbstractSocket::SocketError socket } QPointer that = connection; QString errorString = connection->d_func()->errorDetail(errorCode, socket, socket->errorString()); - if (send2Reply) { - if (reply) { - reply->d_func()->errorString = errorString; - // this error matters only to this reply - emit reply->finishedWithError(errorCode, errorString); - } - // send the next request - QMetaObject::invokeMethod(that, "_q_startNextRequest", Qt::QueuedConnection); - } else { - // the failure affects all requests. - emit connection->error(errorCode, errorString); + + if (reply) { + reply->d_func()->errorString = errorString; + emit reply->finishedWithError(errorCode, errorString); } + // send the next request + QMetaObject::invokeMethod(that, "_q_startNextRequest", Qt::QueuedConnection); + if (that) //signal emission triggered event loop close(); } diff --git a/src/network/access/qnetworkaccesshttpbackend.cpp b/src/network/access/qnetworkaccesshttpbackend.cpp index ec10d34..2a0daf8 100644 --- a/src/network/access/qnetworkaccesshttpbackend.cpp +++ b/src/network/access/qnetworkaccesshttpbackend.cpp @@ -338,12 +338,6 @@ void QNetworkAccessHttpBackend::finished() QNetworkAccessBackend::finished(); } -void QNetworkAccessHttpBackend::setupConnection() -{ - connect(http, SIGNAL(error(QNetworkReply::NetworkError,QString)), - SLOT(httpError(QNetworkReply::NetworkError,QString))); -} - /* For a given httpRequest 1) If AlwaysNetwork, return @@ -672,7 +666,6 @@ void QNetworkAccessHttpBackend::open() cache->addEntry(cacheKey, http); } - setupConnection(); postRequest(); } diff --git a/src/network/access/qnetworkaccesshttpbackend_p.h b/src/network/access/qnetworkaccesshttpbackend_p.h index c4c88ae..568b2ee 100644 --- a/src/network/access/qnetworkaccesshttpbackend_p.h +++ b/src/network/access/qnetworkaccesshttpbackend_p.h @@ -125,7 +125,6 @@ private: quint64 resumeOffset; void disconnectFromHttp(); - void setupConnection(); void validateCache(QHttpNetworkRequest &httpRequest, bool &loadedFromCache); void invalidateCache(); void postRequest(); diff --git a/tests/auto/qhttpnetworkconnection/tst_qhttpnetworkconnection.cpp b/tests/auto/qhttpnetworkconnection/tst_qhttpnetworkconnection.cpp index 29fe2fb..4a32a5a 100644 --- a/tests/auto/qhttpnetworkconnection/tst_qhttpnetworkconnection.cpp +++ b/tests/auto/qhttpnetworkconnection/tst_qhttpnetworkconnection.cpp @@ -330,8 +330,6 @@ void tst_QHttpNetworkConnection::put() connect(reply, SIGNAL(finished()), SLOT(finishedReply())); connect(reply, SIGNAL(finishedWithError(QNetworkReply::NetworkError, const QString &)), SLOT(finishedWithError(QNetworkReply::NetworkError, const QString &))); - connect(&connection, SIGNAL(error(QNetworkReply::NetworkError, const QString &)), - SLOT(finishedWithError(QNetworkReply::NetworkError, const QString &))); QTime stopWatch; stopWatch.start(); -- cgit v0.12 From f964de82d506a379b9d80b18025491aa3521a2c9 Mon Sep 17 00:00:00 2001 From: Peter Hartmann Date: Wed, 27 Oct 2010 17:14:03 +0200 Subject: QNAM: fix build * winsock2.h conflicts with qplatformdefs.h * ifndef QT_NO_OPENSSL was missing Reviewed-by: Prasanth Reviewed-by: Markus Goetz --- src/network/access/qhttpnetworkconnection.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/network/access/qhttpnetworkconnection.cpp b/src/network/access/qhttpnetworkconnection.cpp index 92f8af7..c335cd4 100644 --- a/src/network/access/qhttpnetworkconnection.cpp +++ b/src/network/access/qhttpnetworkconnection.cpp @@ -39,13 +39,13 @@ ** ****************************************************************************/ +#include #include "qhttpnetworkconnection_p.h" #include "qhttpnetworkconnectionchannel_p.h" #include "private/qnoncontiguousbytedevice_p.h" #include #include #include -#include #include #include @@ -129,9 +129,11 @@ void QHttpNetworkConnectionPrivate::pauseConnection() // Disable all socket notifiers for (int i = 0; i < channelCount; i++) { +#ifndef QT_NO_OPENSSL if (encrypt) QSslSocketPrivate::pauseSocketNotifiers(static_cast(channels[i].socket)); else +#endif QAbstractSocketPrivate::pauseSocketNotifiers(channels[i].socket); } } @@ -141,9 +143,11 @@ void QHttpNetworkConnectionPrivate::resumeConnection() state = RunningState; // Enable all socket notifiers for (int i = 0; i < channelCount; i++) { +#ifndef QT_NO_OPENSSL if (encrypt) QSslSocketPrivate::resumeSocketNotifiers(static_cast(channels[i].socket)); else +#endif QAbstractSocketPrivate::resumeSocketNotifiers(channels[i].socket); // Resume pending upload if needed -- cgit v0.12 From 7537554040827dbaae327d27c77319e6b7e7c618 Mon Sep 17 00:00:00 2001 From: Markus Goetz Date: Thu, 28 Oct 2010 10:24:48 +0200 Subject: Network code: Fix code comment spellchecking errors. Me no speak americano. Reviewed-by: Peter Hartmann --- src/network/access/qhttp.cpp | 2 +- src/network/access/qhttpnetworkconnection.cpp | 2 +- src/network/socket/qlocalserver_unix.cpp | 2 +- src/network/socket/qnativesocketengine_win.cpp | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/network/access/qhttp.cpp b/src/network/access/qhttp.cpp index 13375f8..9c2f79a 100644 --- a/src/network/access/qhttp.cpp +++ b/src/network/access/qhttp.cpp @@ -2442,7 +2442,7 @@ void QHttpPrivate::_q_slotSendRequest() if (proxy.hostName().isEmpty()) { proxy.setType(QNetworkProxy::NoProxy); } else if (sslInUse) { - // Disallow use of cacheing proxy with HTTPS; instead fall back to + // Disallow use of caching proxy with HTTPS; instead fall back to // transparent HTTP CONNECT proxying. transparentProxyInUse = true; } else { diff --git a/src/network/access/qhttpnetworkconnection.cpp b/src/network/access/qhttpnetworkconnection.cpp index c335cd4..89f9b03 100644 --- a/src/network/access/qhttpnetworkconnection.cpp +++ b/src/network/access/qhttpnetworkconnection.cpp @@ -745,7 +745,7 @@ void QHttpNetworkConnectionPrivate::removeReply(QHttpNetworkReply *reply) // although it is called _q_startNextRequest, it will actually start multiple requests when possible void QHttpNetworkConnectionPrivate::_q_startNextRequest() { - // If the QHttpNetworkConnection is currently paused then bail out immediatly + // If the QHttpNetworkConnection is currently paused then bail out immediately if (state == PausedState) return; diff --git a/src/network/socket/qlocalserver_unix.cpp b/src/network/socket/qlocalserver_unix.cpp index 560f5f6..c218d89 100644 --- a/src/network/socket/qlocalserver_unix.cpp +++ b/src/network/socket/qlocalserver_unix.cpp @@ -119,7 +119,7 @@ bool QLocalServerPrivate::listen(const QString &requestedServerName) // subsequent call to accept will not block in any case // // This change can be removed once more generic fix to select thread - // syncronization problem is implemented. + // synchronization problem is implemented. int flags = fcntl(listenSocket, F_GETFL, 0); if (-1 == flags || -1 == (fcntl(listenSocket, F_SETFL, flags | O_NONBLOCK))) { diff --git a/src/network/socket/qnativesocketengine_win.cpp b/src/network/socket/qnativesocketengine_win.cpp index 477ef45..c1a4cfc 100644 --- a/src/network/socket/qnativesocketengine_win.cpp +++ b/src/network/socket/qnativesocketengine_win.cpp @@ -733,7 +733,7 @@ int QNativeSocketEnginePrivate::nativeAccept() { int acceptedDescriptor = WSAAccept(socketDescriptor, 0,0,0,0); if (acceptedDescriptor != -1 && QAbstractEventDispatcher::instance()) { - // Becuase of WSAAsyncSelect() WSAAccept returns a non blocking socket + // Because of WSAAsyncSelect() WSAAccept returns a non blocking socket // with the same attributes as the listening socket including the current // WSAAsyncSelect(). To be able to change the socket to blocking mode the // WSAAsyncSelect() call must be cancled. -- cgit v0.12 From 746f4b50e9c13c720162f3bcc8795b7ef772fbba Mon Sep 17 00:00:00 2001 From: Kent Hansen Date: Thu, 28 Oct 2010 12:27:49 +0200 Subject: QScriptValue::construct(): Don't crash if function throws non-Object If an exception occurs, we should ignore the result of JSC::construct() and return the exception value, even if the exception is not an object. This makes the behavior match the documentation: "Calling construct() can cause an exception to occur in the script engine; in that case, construct() returns the value that was thrown". Task-number: QTBUG-14801 Reviewed-by: Jedrzej Nowacki --- src/script/api/qscriptvalue.cpp | 13 ++++++++----- tests/auto/qscriptvalue/tst_qscriptvalue.cpp | 25 +++++++++++++++++++++++++ tests/auto/qscriptvalue/tst_qscriptvalue.h | 1 + 3 files changed, 34 insertions(+), 5 deletions(-) diff --git a/src/script/api/qscriptvalue.cpp b/src/script/api/qscriptvalue.cpp index f6390bb..f494106 100644 --- a/src/script/api/qscriptvalue.cpp +++ b/src/script/api/qscriptvalue.cpp @@ -1736,10 +1736,12 @@ QScriptValue QScriptValue::construct(const QScriptValueList &args) JSC::JSValue savedException; QScriptEnginePrivate::saveException(exec, &savedException); - JSC::JSObject *result = JSC::construct(exec, callee, constructType, constructData, jscArgs); + JSC::JSValue result; + JSC::JSObject *newObject = JSC::construct(exec, callee, constructType, constructData, jscArgs); if (exec->hadException()) { - result = JSC::asObject(exec->exception()); + result = exec->exception(); } else { + result = newObject; QScriptEnginePrivate::restoreException(exec, savedException); } return d->engine->scriptValueFromJSCValue(result); @@ -1796,11 +1798,12 @@ QScriptValue QScriptValue::construct(const QScriptValue &arguments) JSC::JSValue savedException; QScriptEnginePrivate::saveException(exec, &savedException); - JSC::JSObject *result = JSC::construct(exec, callee, constructType, constructData, applyArgs); + JSC::JSValue result; + JSC::JSObject *newObject = JSC::construct(exec, callee, constructType, constructData, applyArgs); if (exec->hadException()) { - if (exec->exception().isObject()) - result = JSC::asObject(exec->exception()); + result = exec->exception(); } else { + result = newObject; QScriptEnginePrivate::restoreException(exec, savedException); } return d->engine->scriptValueFromJSCValue(result); diff --git a/tests/auto/qscriptvalue/tst_qscriptvalue.cpp b/tests/auto/qscriptvalue/tst_qscriptvalue.cpp index 83a3388..639df36 100644 --- a/tests/auto/qscriptvalue/tst_qscriptvalue.cpp +++ b/tests/auto/qscriptvalue/tst_qscriptvalue.cpp @@ -2739,6 +2739,31 @@ void tst_QScriptValue::construct() QVERIFY(!QScriptValue(QScriptValue::NullValue).construct().isValid()); } +void tst_QScriptValue::construct_constructorThrowsPrimitive() +{ + QScriptEngine eng; + QScriptValue fun = eng.evaluate("(function() { throw 123; })"); + QVERIFY(fun.isFunction()); + // construct(QScriptValueList) + { + QScriptValue ret = fun.construct(); + QVERIFY(ret.isNumber()); + QCOMPARE(ret.toNumber(), 123.0); + QVERIFY(eng.hasUncaughtException()); + QVERIFY(ret.strictlyEquals(eng.uncaughtException())); + eng.clearExceptions(); + } + // construct(QScriptValue) + { + QScriptValue ret = fun.construct(eng.newArray()); + QVERIFY(ret.isNumber()); + QCOMPARE(ret.toNumber(), 123.0); + QVERIFY(eng.hasUncaughtException()); + QVERIFY(ret.strictlyEquals(eng.uncaughtException())); + eng.clearExceptions(); + } +} + void tst_QScriptValue::lessThan_old() { QScriptEngine eng; diff --git a/tests/auto/qscriptvalue/tst_qscriptvalue.h b/tests/auto/qscriptvalue/tst_qscriptvalue.h index 8bfaa6a..462749a 100644 --- a/tests/auto/qscriptvalue/tst_qscriptvalue.h +++ b/tests/auto/qscriptvalue/tst_qscriptvalue.h @@ -219,6 +219,7 @@ private slots: void getSetScriptClass(); void call(); void construct(); + void construct_constructorThrowsPrimitive(); void castToPointer(); void prettyPrinter_data(); void prettyPrinter(); -- cgit v0.12 From 9129a27f733169c9a4baf46b1be1c749dabdfdd8 Mon Sep 17 00:00:00 2001 From: Lorn Potter Date: Fri, 29 Oct 2010 10:13:28 +1000 Subject: remove the connecting thread, and use async call to dbus instead. This fixes the case where the connection threads are never stopped until desctuctor. Task-number: QTBUG-14836 Reviewed-by: trust me --- src/plugins/bearer/connman/qconnmanengine.cpp | 83 ++++++---------------- src/plugins/bearer/connman/qconnmanengine.h | 27 ------- .../bearer/connman/qconnmanservice_linux.cpp | 21 +++--- src/plugins/bearer/connman/qofonoservice_linux.cpp | 12 ++-- 4 files changed, 36 insertions(+), 107 deletions(-) diff --git a/src/plugins/bearer/connman/qconnmanengine.cpp b/src/plugins/bearer/connman/qconnmanengine.cpp index a8b8911..184ceb4 100644 --- a/src/plugins/bearer/connman/qconnmanengine.cpp +++ b/src/plugins/bearer/connman/qconnmanengine.cpp @@ -170,13 +170,26 @@ bool QConnmanEngine::hasIdentifier(const QString &id) void QConnmanEngine::connectToId(const QString &id) { QMutexLocker locker(&mutex); - QConnmanConnectThread *thread; - thread = new QConnmanConnectThread(this); - thread->setServicePath(serviceFromId(id)); - thread->setIdentifier(id); - connect(thread,SIGNAL(connectionError(QString,QBearerEngineImpl::ConnectionError)), - this,SIGNAL(connectionError(QString,QBearerEngineImpl::ConnectionError))); - thread->start(); + QString servicePath = serviceFromId(id); + QConnmanServiceInterface serv(servicePath); + if(!serv.isValid()) { + emit connectionError(id, QBearerEngineImpl::InterfaceLookupError); + } else { + if(serv.getType() != "cellular") { + + serv.connect(); + } else { + QOfonoManagerInterface ofonoManager(0); + QString modemPath = ofonoManager.currentModem().path(); + QOfonoDataConnectionManagerInterface dc(modemPath,0); + foreach(const QDBusObjectPath dcPath,dc.getPrimaryContexts()) { + if(dcPath.path().contains(servicePath.section("_",-1))) { + QOfonoPrimaryDataContextInterface primaryContext(dcPath.path(),0); + primaryContext.setActive(true); + } + } + } + } } void QConnmanEngine::disconnectFromId(const QString &id) @@ -791,62 +804,6 @@ bool QConnmanEngine::requiresPolling() const return false; } - -QConnmanConnectThread::QConnmanConnectThread(QObject *parent) - :QThread(parent), - servicePath(), identifier() -{ -} - -QConnmanConnectThread::~QConnmanConnectThread() -{ -} - -void QConnmanConnectThread::stop() -{ - if(currentThread() != this) { - QMetaObject::invokeMethod(this, "quit", - Qt::QueuedConnection); - } else { - quit(); - } - wait(); -} - -void QConnmanConnectThread::run() -{ - QConnmanServiceInterface serv(servicePath); - if(!serv.isValid()) { - emit connectionError(identifier, QBearerEngineImpl::InterfaceLookupError); - } else { - if(serv.getType() != "cellular") { - serv.connect(); - } else { - QOfonoManagerInterface ofonoManager(0); - QString modemPath = ofonoManager.currentModem().path(); - QOfonoDataConnectionManagerInterface dc(modemPath,0); - foreach(const QDBusObjectPath dcPath,dc.getPrimaryContexts()) { - if(dcPath.path().contains(servicePath.section("_",-1))) { - QOfonoPrimaryDataContextInterface primaryContext(dcPath.path(),0); - primaryContext.setActive(true); - } - } - } - } -} - -void QConnmanConnectThread::setServicePath(const QString &path) -{ - QMutexLocker locker(&mutex); - servicePath = path; -} - -void QConnmanConnectThread::setIdentifier(const QString &id) -{ - QMutexLocker locker(&mutex); - identifier = id; -} - QT_END_NAMESPACE #endif // QT_NO_DBUS diff --git a/src/plugins/bearer/connman/qconnmanengine.h b/src/plugins/bearer/connman/qconnmanengine.h index 569bbc7..2a2308f 100644 --- a/src/plugins/bearer/connman/qconnmanengine.h +++ b/src/plugins/bearer/connman/qconnmanengine.h @@ -59,14 +59,12 @@ #include #include -#include #ifndef QT_NO_BEARERMANAGEMENT #ifndef QT_NO_DBUS QT_BEGIN_NAMESPACE -class QConnmanConnectThread; class QConnmanEngine : public QBearerEngineImpl { Q_OBJECT @@ -141,33 +139,8 @@ private: bool isRoamingAllowed(const QString &context); protected: bool requiresPolling() const; - QConnmanConnectThread *connThread; }; -class QConnmanConnectThread : public QThread -{ - Q_OBJECT - -public: - QConnmanConnectThread(QObject *parent = 0); - ~QConnmanConnectThread(); - bool keepRunning; - void stop(); - void setServicePath(const QString &path); - void setIdentifier(const QString &id); - -Q_SIGNALS: - void connectionError(const QString &id, QBearerEngineImpl::ConnectionError error); - -protected: - void run(); - QString servicePath; - QString identifier; - -private: - QMutex mutex; - -}; QT_END_NAMESPACE diff --git a/src/plugins/bearer/connman/qconnmanservice_linux.cpp b/src/plugins/bearer/connman/qconnmanservice_linux.cpp index 549a07a..46b6e80 100644 --- a/src/plugins/bearer/connman/qconnmanservice_linux.cpp +++ b/src/plugins/bearer/connman/qconnmanservice_linux.cpp @@ -79,7 +79,7 @@ if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QDBusVariant))) { QLatin1String(CONNMAN_MANAGER_PATH), QLatin1String(CONNMAN_MANAGER_INTERFACE), QLatin1String("PropertyChanged"), - this,SIGNAL(propertyChanged(const QString &, const QDBusVariant & )))) { + this,SIGNAL(propertyChanged(const QString &, const QDBusVariant & ))), Qt::UniqueConnection) { qWarning() << "PropertyCHanged not connected"; } } @@ -89,7 +89,7 @@ if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QDBusVariant))) { QLatin1String(CONNMAN_MANAGER_PATH), QLatin1String(CONNMAN_MANAGER_INTERFACE), QLatin1String("StateChanged"), - this,SIGNAL(stateChanged(const QString&)))) { + this,SIGNAL(stateChanged(const QString&))), Qt::UniqueConnection) { qWarning() << "StateChanged not connected"; } @@ -106,7 +106,7 @@ if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QDBusVariant))) { QObject::connect(helper,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)), - this,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &))); + this,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)), Qt::UniqueConnection); } } @@ -338,7 +338,7 @@ void QConnmanNetworkInterface::connectNotify(const char *signal) this->path(), QLatin1String(CONNMAN_NETWORK_INTERFACE), QLatin1String("PropertyChanged"), - this,SIGNAL(propertyChanged(QString,QDBusVariant))) ) { + this,SIGNAL(propertyChanged(QString,QDBusVariant))), Qt::UniqueConnection) { qWarning() << "network properties not connected"; } } @@ -350,10 +350,10 @@ void QConnmanNetworkInterface::connectNotify(const char *signal) this->path(), QLatin1String(CONNMAN_NETWORK_INTERFACE), QLatin1String("PropertyChanged"), - helper,SLOT(propertyChanged(QString,QDBusVariant))); + helper,SLOT(propertyChanged(QString,QDBusVariant))), Qt::UniqueConnection; QObject::connect(helper,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)), - this,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &))); + this,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)), Qt::UniqueConnection); } } @@ -538,7 +538,7 @@ void QConnmanServiceInterface::connectNotify(const char *signal) helper,SLOT(propertyChanged(QString,QDBusVariant))); QObject::connect(helper,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)), - this,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &))); + this,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)), Qt::UniqueConnection); } } @@ -569,10 +569,9 @@ QVariant QConnmanServiceInterface::getProperty(const QString &property) return var; } -// clearProperty void QConnmanServiceInterface::connect() { - QDBusReply reply = this->call(QLatin1String("Connect")); + this->asyncCall(QLatin1String("Connect")); } void QConnmanServiceInterface::disconnect() @@ -866,7 +865,7 @@ void QConnmanTechnologyInterface::connectNotify(const char *signal) helper,SLOT(propertyChanged(QString,QDBusVariant))); QObject::connect(helper,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)), - this,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &))); + this,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)), Qt::UniqueConnection); } } @@ -1031,7 +1030,7 @@ void QConnmanDeviceInterface::connectNotify(const char *signal) helper,SLOT(propertyChanged(QString,QDBusVariant))); QObject::connect(helper,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)), - this,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &))); + this,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)), Qt::UniqueConnection); } } diff --git a/src/plugins/bearer/connman/qofonoservice_linux.cpp b/src/plugins/bearer/connman/qofonoservice_linux.cpp index 955f4b1..52f596b 100644 --- a/src/plugins/bearer/connman/qofonoservice_linux.cpp +++ b/src/plugins/bearer/connman/qofonoservice_linux.cpp @@ -262,7 +262,7 @@ void QOfonoModemInterface::connectNotify(const char *signal) QObject::connect(helper,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)), - this,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &))); + this,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)), Qt::UniqueConnection); }} void QOfonoModemInterface::disconnectNotify(const char *signal) @@ -385,7 +385,7 @@ if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QDBusVariant))) { QObject::connect(helper,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)), - this,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &))); + this,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)), Qt::UniqueConnection); } } @@ -483,7 +483,7 @@ if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QDBusVariant))) { QObject::connect(helper,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)), - this,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &))); + this,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)), Qt::UniqueConnection); } } @@ -586,7 +586,7 @@ if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QDBusVariant))) { QObject::connect(helper,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)), - this,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &))); + this,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)), Qt::UniqueConnection); } } @@ -675,7 +675,7 @@ if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QDBusVariant))) { QObject::connect(helper,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)), - this,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &))); + this,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)), Qt::UniqueConnection); } } @@ -794,7 +794,7 @@ if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QDBusVariant))) { QObject::connect(helper,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)), - this,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &))); + this,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)), Qt::UniqueConnection); } } -- cgit v0.12 From 60948c48adc376cefa774bd101de34c60db52dea Mon Sep 17 00:00:00 2001 From: Markus Goetz Date: Fri, 29 Oct 2010 10:23:07 +0200 Subject: QNAM: Fix doc rendering of QNetworkRequest Reviewed-by: Morten Engvoldsen --- src/network/access/qnetworkrequest.cpp | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/network/access/qnetworkrequest.cpp b/src/network/access/qnetworkrequest.cpp index d3084cf..b761af5 100644 --- a/src/network/access/qnetworkrequest.cpp +++ b/src/network/access/qnetworkrequest.cpp @@ -194,16 +194,12 @@ QT_BEGIN_NAMESPACE \value CookieLoadControlAttribute Requests only, type: QVariant::Int (default: QNetworkRequest::Automatic) Indicates whether to send 'Cookie' headers in the request. - This attribute is set to false by QtWebKit when creating a cross-origin XMLHttpRequest where withCredentials has not been set explicitly to true by the Javascript that created the request. - See \l{http://www.w3.org/TR/XMLHttpRequest2/#credentials-flag}{here} for more information. - (This value was introduced in 4.7.) - \value CookieSaveControlAttribute Requests only, type: QVariant::Int (default: QNetworkRequest::Automatic) Indicates whether to save 'Cookie' headers received from the server in reply @@ -211,9 +207,7 @@ QT_BEGIN_NAMESPACE This attribute is set to false by QtWebKit when creating a cross-origin XMLHttpRequest where withCredentials has not been set explicitly to true by the Javascript that created the request. - See \l{http://www.w3.org/TR/XMLHttpRequest2/#credentials-flag} {here} for more information. - (This value was introduced in 4.7.) \value AuthenticationReuseAttribute @@ -225,16 +219,12 @@ QT_BEGIN_NAMESPACE This attribute is set to QNetworkRequest::Manual by QtWebKit when creating a cross-origin XMLHttpRequest where withCredentials has not been set explicitly to true by the Javascript that created the request. - See \l{http://www.w3.org/TR/XMLHttpRequest2/#credentials-flag} {here} for more information. - (This value was introduced in 4.7.) \omitvalue MaximumDownloadBufferSizeAttribute - (This value was introduced in 4.7.) \omitvalue DownloadBufferAttribute - (This value was introduced in 4.7.) \value User Special type. Additional information can be passed in -- cgit v0.12