diff options
Diffstat (limited to 'src/network/access/qnetworkreplyhttpimpl.cpp')
-rw-r--r-- | src/network/access/qnetworkreplyhttpimpl.cpp | 66 |
1 files changed, 37 insertions, 29 deletions
diff --git a/src/network/access/qnetworkreplyhttpimpl.cpp b/src/network/access/qnetworkreplyhttpimpl.cpp index 4efb2f6a2a..796f51b9b1 100644 --- a/src/network/access/qnetworkreplyhttpimpl.cpp +++ b/src/network/access/qnetworkreplyhttpimpl.cpp @@ -194,7 +194,7 @@ QNetworkReplyHttpImpl::QNetworkReplyHttpImpl(QNetworkAccessManager* const manage if (d->synchronous && outgoingData) { // The synchronous HTTP is a corner case, we will put all upload data in one big QByteArray in the outgoingDataBuffer. // Yes, this is not the most efficient thing to do, but on the other hand synchronous XHR needs to die anyway. - d->outgoingDataBuffer = QSharedPointer<QRingBuffer>(new QRingBuffer()); + d->outgoingDataBuffer = QSharedPointer<QRingBuffer>::create(); qint64 previousDataSize = 0; do { previousDataSize = d->outgoingDataBuffer->size(); @@ -250,8 +250,8 @@ void QNetworkReplyHttpImpl::close() { Q_D(QNetworkReplyHttpImpl); - if (d->state == QNetworkReplyHttpImplPrivate::Aborted || - d->state == QNetworkReplyHttpImplPrivate::Finished) + if (d->state == QNetworkReplyPrivate::Aborted || + d->state == QNetworkReplyPrivate::Finished) return; // According to the documentation close only stops the download @@ -268,19 +268,23 @@ void QNetworkReplyHttpImpl::abort() { Q_D(QNetworkReplyHttpImpl); // FIXME - if (d->state == QNetworkReplyHttpImplPrivate::Finished || d->state == QNetworkReplyHttpImplPrivate::Aborted) + if (d->state == QNetworkReplyPrivate::Finished || d->state == QNetworkReplyPrivate::Aborted) return; QNetworkReply::close(); - if (d->state != QNetworkReplyHttpImplPrivate::Finished) { + if (d->state != QNetworkReplyPrivate::Finished) { // call finished which will emit signals // FIXME shouldn't this be emitted Queued? d->error(OperationCanceledError, tr("Operation canceled")); + + // If state is WaitingForSession, calling finished has no effect + if (d->state == QNetworkReplyPrivate::WaitingForSession) + d->state = QNetworkReplyPrivate::Working; d->finished(); } - d->state = QNetworkReplyHttpImplPrivate::Aborted; + d->state = QNetworkReplyPrivate::Aborted; emit abortHttpRequest(); } @@ -440,8 +444,8 @@ QNetworkReplyHttpImplPrivate::QNetworkReplyHttpImplPrivate() , downloadBufferReadPosition(0) , downloadBufferCurrentSize(0) , downloadZerocopyBuffer(0) - , pendingDownloadDataEmissions(new QAtomicInt()) - , pendingDownloadProgressEmissions(new QAtomicInt()) + , pendingDownloadDataEmissions(QSharedPointer<QAtomicInt>::create()) + , pendingDownloadProgressEmissions(QSharedPointer<QAtomicInt>::create()) #ifndef QT_NO_SSL , pendingIgnoreAllSslErrors(false) #endif @@ -556,23 +560,21 @@ bool QNetworkReplyHttpImplPrivate::loadFromCacheIfAllowed(QHttpNetworkRequest &h int resident_time = now - response_time; int current_age = corrected_initial_age + resident_time; + int freshness_lifetime = 0; + // RFC 2616 13.2.4 Expiration Calculations - if (!expirationDate.isValid()) { - if (lastModified.isValid()) { - int diff = currentDateTime.secsTo(lastModified); - expirationDate = lastModified.addSecs(diff / 10); - if (httpRequest.headerField("Warning").isEmpty()) { - QDateTime dt; - dt.setTime_t(current_age); - if (dt.daysTo(currentDateTime) > 1) - httpRequest.setHeaderField("Warning", "113"); - } + if (lastModified.isValid() && dateHeader.isValid()) { + int diff = lastModified.secsTo(dateHeader); + freshness_lifetime = diff / 10; + if (httpRequest.headerField("Warning").isEmpty()) { + QDateTime dt = currentDateTime.addSecs(current_age); + if (currentDateTime.daysTo(dt) > 1) + httpRequest.setHeaderField("Warning", "113"); } } - // the cache-saving code below sets the expirationDate with date+max_age - // if "max-age" is present, or to Expires otherwise - int freshness_lifetime = dateHeader.secsTo(expirationDate); + // the cache-saving code below sets the freshness_lifetime with (dateHeader - last_modified) / 10 + // if "last-modified" is present, or to Expires otherwise response_is_fresh = (freshness_lifetime > current_age); } else { // expiration date was calculated earlier (e.g. when storing object to the cache) @@ -1583,8 +1585,14 @@ bool QNetworkReplyHttpImplPrivate::start() q, SLOT(_q_networkSessionUsagePoliciesChanged(QNetworkSession::UsagePolicies))); postRequest(); return true; + } else if (synchronous) { + // Command line applications using the synchronous path such as xmlpatterns may need an extra push. + networkSession->open(); + if (networkSession->waitForOpened()) { + postRequest(); + return true; + } } - return false; #endif } @@ -1743,7 +1751,7 @@ void QNetworkReplyHttpImplPrivate::_q_bufferOutgoingData() if (!outgoingDataBuffer) { // first call, create our buffer - outgoingDataBuffer = QSharedPointer<QRingBuffer>(new QRingBuffer()); + outgoingDataBuffer = QSharedPointer<QRingBuffer>::create(); QObject::connect(outgoingData, SIGNAL(readyRead()), q, SLOT(_q_bufferOutgoingData())); QObject::connect(outgoingData, SIGNAL(readChannelFinished()), q, SLOT(_q_bufferOutgoingDataFinished())); @@ -1796,13 +1804,13 @@ void QNetworkReplyHttpImplPrivate::_q_networkSessionConnected() return; switch (state) { - case QNetworkReplyImplPrivate::Buffering: - case QNetworkReplyImplPrivate::Working: - case QNetworkReplyImplPrivate::Reconnecting: + case QNetworkReplyPrivate::Buffering: + case QNetworkReplyPrivate::Working: + case QNetworkReplyPrivate::Reconnecting: // Migrate existing downloads to new network connection. migrateBackend(); break; - case QNetworkReplyImplPrivate::WaitingForSession: + case QNetworkReplyPrivate::WaitingForSession: // Start waiting requests. QMetaObject::invokeMethod(q, "_q_startOperation", Qt::QueuedConnection); break; @@ -1872,9 +1880,9 @@ QNonContiguousByteDevice* QNetworkReplyHttpImplPrivate::createUploadByteDevice() Q_Q(QNetworkReplyHttpImpl); if (outgoingDataBuffer) - uploadByteDevice = QSharedPointer<QNonContiguousByteDevice>(QNonContiguousByteDeviceFactory::create(outgoingDataBuffer)); + uploadByteDevice = QNonContiguousByteDeviceFactory::createShared(outgoingDataBuffer); else if (outgoingData) { - uploadByteDevice = QSharedPointer<QNonContiguousByteDevice>(QNonContiguousByteDeviceFactory::create(outgoingData)); + uploadByteDevice = QNonContiguousByteDeviceFactory::createShared(outgoingData); } else { return 0; } |