Ignore:
Timestamp:
Mar 8, 2010, 12:52:58 PM (15 years ago)
Author:
Dmitry A. Kuminov
Message:

trunk: Merged in qt 4.6.2 sources.

Location:
trunk
Files:
56 edited

Legend:

Unmodified
Added
Removed
  • trunk

  • trunk/src/network/access/qabstractnetworkcache.cpp

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/src/network/access/qabstractnetworkcache.h

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/src/network/access/qabstractnetworkcache_p.h

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/src/network/access/qfilenetworkreply.cpp

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
     
    4545#include <QtCore/QCoreApplication>
    4646#include <QtCore/QFileInfo>
     47#include <QDebug>
    4748
    4849QT_BEGIN_NAMESPACE
    4950
    5051QFileNetworkReplyPrivate::QFileNetworkReplyPrivate()
    51     : QNetworkReplyPrivate(), realFileSize(0), finished(false)
     52    : QNetworkReplyPrivate(), realFileSize(0)
    5253{
    53 }
    54 
    55 QFileNetworkReply::QFileNetworkReply(QObject *parent, const QNetworkRequest &req)
    56     : QNetworkReply(*new QFileNetworkReplyPrivate(), parent)
    57 {
    58     setRequest(req);
    59     setUrl(req.url());
    60     setOperation(QNetworkAccessManager::GetOperation);
    61     QMetaObject::invokeMethod(this, "_q_startOperation", Qt::QueuedConnection);
    62     QNetworkReply::open(QIODevice::ReadOnly);
    6354}
    6455
     
    6758}
    6859
    69 // This code is mostly inspired by QNetworkAccessFileBackend
    70 // We also use its translation context for error messages
    71 void QFileNetworkReplyPrivate::_q_startOperation()
     60QFileNetworkReply::QFileNetworkReply(QObject *parent, const QNetworkRequest &req, const QNetworkAccessManager::Operation op)
     61    : QNetworkReply(*new QFileNetworkReplyPrivate(), parent)
    7262{
    73     Q_Q(QFileNetworkReply);
     63    setRequest(req);
     64    setUrl(req.url());
     65    setOperation(op);
     66    QNetworkReply::open(QIODevice::ReadOnly);
    7467
    75     QUrl url = q->url();
     68    qRegisterMetaType<QNetworkReply::NetworkError>("QNetworkReply::NetworkError");
     69
     70    QFileNetworkReplyPrivate *d = (QFileNetworkReplyPrivate*) d_func();
     71
     72    QUrl url = req.url();
    7673    if (url.host() == QLatin1String("localhost"))
    7774        url.setHost(QString());
     
    8279        // we handle only local files
    8380        QString msg = QCoreApplication::translate("QNetworkAccessFileBackend", "Request for opening non-local file %1").arg(url.toString());
    84         q->setError(QNetworkReply::ProtocolInvalidOperationError, msg);
    85         emit q->error(QNetworkReply::ProtocolInvalidOperationError);
    86         doFinished();
     81        setError(QNetworkReply::ProtocolInvalidOperationError, msg);
     82        QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection,
     83            Q_ARG(QNetworkReply::NetworkError, QNetworkReply::ProtocolInvalidOperationError));
     84        QMetaObject::invokeMethod(this, "finished", Qt::QueuedConnection);
    8785        return;
    8886    }
     
    9088    if (url.path().isEmpty())
    9189        url.setPath(QLatin1String("/"));
    92     q->setUrl(url);
     90    setUrl(url);
    9391
    9492
     
    9795        fileName = url.toString(QUrl::RemoveAuthority | QUrl::RemoveFragment | QUrl::RemoveQuery);
    9896    }
    99     realFile.setFileName(fileName);
     97    d->realFile.setFileName(fileName);
    10098
    101     QFileInfo fi(realFile);
     99    QFileInfo fi(d->realFile);
    102100    if (fi.isDir()) {
    103101        QString msg = QCoreApplication::translate("QNetworkAccessFileBackend", "Cannot open %1: Path is a directory").arg(url.toString());
    104         q->setError(QNetworkReply::ContentOperationNotPermittedError, msg);
    105         emit q->error(QNetworkReply::ContentOperationNotPermittedError);
    106         doFinished();
     102        setError(QNetworkReply::ContentOperationNotPermittedError, msg);
     103        QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection,
     104            Q_ARG(QNetworkReply::NetworkError, QNetworkReply::ContentOperationNotPermittedError));
     105        QMetaObject::invokeMethod(this, "finished", Qt::QueuedConnection);
    107106        return;
    108107    }
    109108
    110     bool opened = realFile.open(QIODevice::ReadOnly | QIODevice::Unbuffered);
     109    bool opened = d->realFile.open(QIODevice::ReadOnly | QIODevice::Unbuffered);
    111110
    112111    // could we open the file?
    113112    if (!opened) {
    114113        QString msg = QCoreApplication::translate("QNetworkAccessFileBackend", "Error opening %1: %2")
    115                       .arg(realFile.fileName(), realFile.errorString());
     114                      .arg(d->realFile.fileName(), d->realFile.errorString());
    116115
    117         if (realFile.exists()) {
    118             q->setError(QNetworkReply::ContentAccessDenied, msg);
    119             emit q->error(QNetworkReply::ContentAccessDenied);
     116        if (d->realFile.exists()) {
     117            setError(QNetworkReply::ContentAccessDenied, msg);
     118            QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection,
     119                Q_ARG(QNetworkReply::NetworkError, QNetworkReply::ContentAccessDenied));
    120120        } else {
    121             q->setError(QNetworkReply::ContentNotFoundError, msg);
    122             emit q->error(QNetworkReply::ContentNotFoundError);
     121            setError(QNetworkReply::ContentNotFoundError, msg);
     122            QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection,
     123                Q_ARG(QNetworkReply::NetworkError, QNetworkReply::ContentNotFoundError));
    123124        }
    124         doFinished();
     125        QMetaObject::invokeMethod(this, "finished", Qt::QueuedConnection);
    125126        return;
    126127    }
    127128
    128     realFileSize = fi.size();
    129     q->setHeader(QNetworkRequest::LastModifiedHeader, fi.lastModified());
    130     q->setHeader(QNetworkRequest::ContentLengthHeader, realFileSize);
     129    d->realFileSize = fi.size();
     130    setHeader(QNetworkRequest::LastModifiedHeader, fi.lastModified());
     131    setHeader(QNetworkRequest::ContentLengthHeader, d->realFileSize);
    131132
    132     emit q->metaDataChanged();
    133     emit q->downloadProgress(realFileSize, realFileSize);
    134     emit q->readyRead();
    135     doFinished();
     133    QMetaObject::invokeMethod(this, "metaDataChanged", Qt::QueuedConnection);
     134    QMetaObject::invokeMethod(this, "downloadProgress", Qt::QueuedConnection,
     135        Q_ARG(qint64, d->realFileSize), Q_ARG(qint64, d->realFileSize));
     136    QMetaObject::invokeMethod(this, "readyRead", Qt::QueuedConnection);
     137    QMetaObject::invokeMethod(this, "finished", Qt::QueuedConnection);
    136138}
    137139
    138140bool QFileNetworkReplyPrivate::isFinished() const
    139141{
    140     return finished;
     142    return true;
    141143}
    142 
    143 void QFileNetworkReplyPrivate::doFinished()
    144 {
    145     Q_Q(QFileNetworkReply);
    146     finished = true;
    147     emit q->finished();
    148 }
    149 
    150144
    151145void QFileNetworkReply::close()
     
    154148    QNetworkReply::close();
    155149    d->realFile.close();
    156 
    157     if (!d->finished)
    158         d->doFinished();
    159150}
    160151
     
    164155    QNetworkReply::close();
    165156    d->realFile.close();
    166 
    167     if (!d->finished)
    168         d->doFinished();
    169157}
    170158
  • trunk/src/network/access/qfilenetworkreply_p.h

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
     
    6767    Q_OBJECT
    6868public:
    69     QFileNetworkReply(QObject *parent, const QNetworkRequest &req);
     69    QFileNetworkReply(QObject *parent, const QNetworkRequest &req, const QNetworkAccessManager::Operation op);
    7070    ~QFileNetworkReply();
    7171    virtual void abort();
     
    7777    qint64 size() const;
    7878
    79 
    8079    virtual qint64 readData(char *data, qint64 maxlen);
    8180
    8281    Q_DECLARE_PRIVATE(QFileNetworkReply)
    83     Q_PRIVATE_SLOT(d_func(), void _q_startOperation())
    84 
    8582};
    8683
     
    9390    qint64 realFileSize;
    9491
    95     void _q_startOperation();
    96 
    9792    virtual bool isFinished() const;
    98     void doFinished();
    99     bool finished;
    100 
    10193
    10294    Q_DECLARE_PUBLIC(QFileNetworkReply)
  • trunk/src/network/access/qftp.cpp

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/src/network/access/qftp.h

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/src/network/access/qhttp.cpp

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/src/network/access/qhttp.h

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/src/network/access/qhttpnetworkconnection.cpp

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
     
    416416        break;
    417417    }
    418     QMetaObject::invokeMethod(q, "_q_startNextRequest", Qt::QueuedConnection);
     418    // this used to be called via invokeMethod and a QueuedConnection
     419    _q_startNextRequest();
    419420    return reply;
    420421}
     
    422423void QHttpNetworkConnectionPrivate::requeueRequest(const HttpMessagePair &pair)
    423424{
    424     Q_Q(QHttpNetworkConnection);
    425 
    426425    QHttpNetworkRequest request = pair.first;
    427426    switch (request.priority()) {
     
    434433        break;
    435434    }
    436     QMetaObject::invokeMethod(q, "_q_startNextRequest", Qt::QueuedConnection);
     435    // this used to be called via invokeMethod and a QueuedConnection
     436    _q_startNextRequest();
    437437}
    438438
     
    565565
    566566
    567 QString QHttpNetworkConnectionPrivate::errorDetail(QNetworkReply::NetworkError errorCode, QAbstractSocket* socket)
     567QString QHttpNetworkConnectionPrivate::errorDetail(QNetworkReply::NetworkError errorCode, QAbstractSocket* socket,
     568                                                   const QString &extraDetail)
    568569{
    569570    Q_ASSERT(socket);
     
    582583        break;
    583584    case QNetworkReply::TimeoutError:
    584         errorString = QLatin1String(QT_TRANSLATE_NOOP("QHttp", "HTTP request failed"));
     585        errorString = QLatin1String(QT_TRANSLATE_NOOP("QAbstractSocket", "Socket operation timed out"));
    585586        break;
    586587    case QNetworkReply::ProxyAuthenticationRequiredError:
     
    601602    default:
    602603        // all other errors are treated as QNetworkReply::UnknownNetworkError
    603         errorString = QLatin1String(QT_TRANSLATE_NOOP("QHttp", "HTTP request failed"));
     604        errorString = extraDetail;
    604605        break;
    605606    }
     
    692693        }
    693694    }
     695
     696    // dequeue new ones
     697
    694698    QAbstractSocket *socket = 0;
    695699    for (int i = 0; i < channelCount; ++i) {
    696700        QAbstractSocket *chSocket = channels[i].socket;
    697         // send the request using the idle socket
    698         if (!channels[i].isSocketBusy()) {
     701        // try to get a free AND connected socket
     702        if (!channels[i].isSocketBusy() && channels[i].socket->state() == QAbstractSocket::ConnectedState) {
    699703            socket = chSocket;
     704            dequeueAndSendRequest(socket);
    700705            break;
    701706        }
    702707    }
    703708
    704     // this socket is free,
    705     if (socket)
    706         dequeueAndSendRequest(socket);
     709    if (!socket) {
     710        for (int i = 0; i < channelCount; ++i) {
     711            QAbstractSocket *chSocket = channels[i].socket;
     712            // try to get a free unconnected socket
     713            if (!channels[i].isSocketBusy()) {
     714                socket = chSocket;
     715                dequeueAndSendRequest(socket);
     716                break;
     717            }
     718        }
     719    }
    707720
    708721    // try to push more into all sockets
     
    732745}
    733746
     747void QHttpNetworkConnectionPrivate::readMoreLater(QHttpNetworkReply *reply)
     748{
     749    for (int i = 0 ; i < channelCount; ++i) {
     750        if (channels[i].reply ==  reply) {
     751            // emulate a readyRead() from the socket
     752            QMetaObject::invokeMethod(&channels[i], "_q_readyRead", Qt::QueuedConnection);
     753            return;
     754        }
     755    }
     756}
    734757
    735758QHttpNetworkConnection::QHttpNetworkConnection(const QString &hostName, quint16 port, bool encrypt, QObject *parent)
  • trunk/src/network/access/qhttpnetworkconnection_p.h

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
     
    175175    bool fillPipeline(QList<HttpMessagePair> &queue, QHttpNetworkConnectionChannel &channel);
    176176
     177    // read more HTTP body after the next event loop spin
     178    void readMoreLater(QHttpNetworkReply *reply);
     179
    177180    void copyCredentials(int fromChannel, QAuthenticator *auth, bool isProxy);
    178181
     
    183186    void createAuthorization(QAbstractSocket *socket, QHttpNetworkRequest &request);
    184187
    185     QString errorDetail(QNetworkReply::NetworkError errorCode, QAbstractSocket *socket);
     188    QString errorDetail(QNetworkReply::NetworkError errorCode, QAbstractSocket *socket,
     189                        const QString &extraDetail = QString());
    186190
    187191#ifndef QT_NO_COMPRESS
  • trunk/src/network/access/qhttpnetworkconnectionchannel.cpp

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
     
    167167#endif
    168168        socket->write(header);
     169        // flushing is dangerous (QSslSocket calls transmit which might read or error)
     170//        socket->flush();
    169171        QNonContiguousByteDevice* uploadByteDevice = request.uploadByteDevice();
    170172        if (uploadByteDevice) {
     
    259261        // this is needed if the sends an reply before we have finished sending the request. In that
    260262        // case receiveReply had been called before but ignored the server reply
    261         receiveReply();
     263        QMetaObject::invokeMethod(this, "_q_receiveReply", Qt::QueuedConnection);
    262264        break;
    263265    }
     
    273275
    274276
    275 void QHttpNetworkConnectionChannel::receiveReply()
     277void QHttpNetworkConnectionChannel::_q_receiveReply()
    276278{
    277279    Q_ASSERT(socket);
     
    325327            break;
    326328        }
    327         case QHttpNetworkReplyPrivate::ReadingHeaderState:
    328             bytes += reply->d_func()->readHeader(socket);
    329             if (reply->d_func()->state == QHttpNetworkReplyPrivate::ReadingDataState) {
    330                 if (reply->d_func()->isGzipped() && reply->d_func()->autoDecompress) {
     329        case QHttpNetworkReplyPrivate::ReadingHeaderState: {
     330            QHttpNetworkReplyPrivate *replyPrivate = reply->d_func();
     331            bytes += replyPrivate->readHeader(socket);
     332            if (replyPrivate->state == QHttpNetworkReplyPrivate::ReadingDataState) {
     333                if (replyPrivate->isGzipped() && replyPrivate->autoDecompress) {
    331334                    // remove the Content-Length from header
    332                     reply->d_func()->removeAutoDecompressHeader();
     335                    replyPrivate->removeAutoDecompressHeader();
    333336                } else {
    334                     reply->d_func()->autoDecompress = false;
     337                    replyPrivate->autoDecompress = false;
    335338                }
    336                 if (reply && reply->d_func()->statusCode == 100) {
    337                     reply->d_func()->state = QHttpNetworkReplyPrivate::ReadingStatusState;
     339                if (replyPrivate->statusCode == 100) {
     340                    replyPrivate->state = QHttpNetworkReplyPrivate::ReadingStatusState;
    338341                    break; // ignore
    339342                }
    340                 if (reply->d_func()->shouldEmitSignals())
     343                if (replyPrivate->shouldEmitSignals())
    341344                    emit reply->headerChanged();
    342                 if (!reply->d_func()->expectContent()) {
    343                     reply->d_func()->state = QHttpNetworkReplyPrivate::AllDoneState;
     345                if (!replyPrivate->expectContent()) {
     346                    replyPrivate->state = QHttpNetworkReplyPrivate::AllDoneState;
    344347                    this->state = QHttpNetworkConnectionChannel::IdleState;
    345348                    allDone();
     
    348351            }
    349352            break;
     353        }
    350354        case QHttpNetworkReplyPrivate::ReadingDataState: {
    351             if (!reply->d_func()->isChunked() && !reply->d_func()->autoDecompress
    352                 && reply->d_func()->bodyLength > 0) {
     355           QHttpNetworkReplyPrivate *replyPrivate = reply->d_func();
     356           if (replyPrivate->downstreamLimited && !replyPrivate->responseData.isEmpty() && replyPrivate->shouldEmitSignals()) {
     357               // We already have some HTTP body data. We don't read more from the socket until
     358               // this is fetched by QHttpNetworkAccessHttpBackend. If we would read more,
     359               // we could not limit our read buffer usage.
     360               // We only do this when shouldEmitSignals==true because our HTTP parsing
     361               // always needs to parse the 401/407 replies. Therefore they don't really obey
     362               // to the read buffer maximum size, but we don't care since they should be small.
     363               return;
     364           }
     365
     366            if (!replyPrivate->isChunked() && !replyPrivate->autoDecompress
     367                && replyPrivate->bodyLength > 0) {
    353368                // bulk files like images should fulfill these properties and
    354369                // we can therefore save on memory copying
    355                 bytes = reply->d_func()->readBodyFast(socket, &reply->d_func()->responseData);
    356                 reply->d_func()->totalProgress += bytes;
    357                 if (reply->d_func()->shouldEmitSignals()) {
     370                bytes = replyPrivate->readBodyFast(socket, &replyPrivate->responseData);
     371                replyPrivate->totalProgress += bytes;
     372                if (replyPrivate->shouldEmitSignals()) {
    358373                    QPointer<QHttpNetworkReply> replyPointer = reply;
    359374                    emit reply->readyRead();
     
    361376                    if (replyPointer.isNull())
    362377                        return;
    363                     emit reply->dataReadProgress(reply->d_func()->totalProgress, reply->d_func()->bodyLength);
     378                    emit reply->dataReadProgress(replyPrivate->totalProgress, replyPrivate->bodyLength);
    364379                    // make sure that the reply is valid
    365380                    if (replyPointer.isNull())
     
    372387                // no content-length etc)
    373388                QByteDataBuffer byteDatas;
    374                 bytes = reply->d_func()->readBody(socket, &byteDatas);
     389                bytes = replyPrivate->readBody(socket, &byteDatas);
    375390                if (bytes) {
    376                     if (reply->d_func()->autoDecompress)
    377                         reply->d_func()->appendCompressedReplyData(byteDatas);
     391                    if (replyPrivate->autoDecompress)
     392                        replyPrivate->appendCompressedReplyData(byteDatas);
    378393                    else
    379                         reply->d_func()->appendUncompressedReplyData(byteDatas);
    380 
    381                     if (!reply->d_func()->autoDecompress) {
    382                         reply->d_func()->totalProgress += bytes;
    383                         if (reply->d_func()->shouldEmitSignals()) {
     394                        replyPrivate->appendUncompressedReplyData(byteDatas);
     395
     396                    if (!replyPrivate->autoDecompress) {
     397                        replyPrivate->totalProgress += bytes;
     398                        if (replyPrivate->shouldEmitSignals()) {
    384399                            QPointer<QHttpNetworkReply> replyPointer = reply;
    385400                            // important: At the point of this readyRead(), the byteDatas list must be empty,
     
    389404                            if (replyPointer.isNull())
    390405                                return;
    391                             emit reply->dataReadProgress(reply->d_func()->totalProgress, reply->d_func()->bodyLength);
     406                            emit reply->dataReadProgress(replyPrivate->totalProgress, replyPrivate->bodyLength);
    392407                            // make sure that the reply is valid
    393408                           if (replyPointer.isNull())
     
    402417                }
    403418            }
    404             if (reply->d_func()->state == QHttpNetworkReplyPrivate::ReadingDataState)
     419            if (replyPrivate->state == QHttpNetworkReplyPrivate::ReadingDataState)
    405420                break;
    406421            // everything done, fall through
     
    418433bool QHttpNetworkConnectionChannel::ensureConnection()
    419434{
     435    QAbstractSocket::SocketState socketState = socket->state();
     436
     437    // resend this request after we receive the disconnected signal
     438    if (socketState == QAbstractSocket::ClosingState) {
     439        resendCurrent = true;
     440        return false;
     441    }
     442
     443    // already trying to connect?
     444    if (socketState == QAbstractSocket::HostLookupState ||
     445        socketState == QAbstractSocket::ConnectingState) {
     446        return false;
     447    }
     448
    420449    // make sure that this socket is in a connected state, if not initiate
    421450    // connection to the host.
    422     if (socket->state() != QAbstractSocket::ConnectedState) {
     451    if (socketState != QAbstractSocket::ConnectedState) {
    423452        // connect to the host if not already connected.
    424         // resend this request after we receive the disconnected signal
    425         if (socket->state() == QAbstractSocket::ClosingState) {
    426             resendCurrent = true;
    427             return false;
    428         }
    429453        state = QHttpNetworkConnectionChannel::ConnectingState;
    430454        pendingEncrypt = connection->d_func()->encrypt;
     
    568592
    569593            // continue reading
    570             receiveReply();
     594            _q_receiveReply();
    571595        }
    572596    } else if (alreadyPipelinedRequests.isEmpty() && socket->bytesAvailable() > 0) {
     
    617641{
    618642    char c;
    619     while (socket->bytesAvailable()) {
    620         if (socket->peek(&c, 1) != 1)
     643    do {
     644        qint64 ret = socket->peek(&c, 1);
     645
     646        // nothing read, fine.
     647        if (ret == 0)
    621648            return;
     649
     650        // EOF from socket?
     651        if (ret == -1)
     652            return; // FIXME, we need to stop processing. however the next stuff done will also do that.
    622653
    623654        // read all whitespace and line endings
     
    628659            break;
    629660        }
    630     }
     661    } while(true);
    631662}
    632663
     
    740771        state = QHttpNetworkConnectionChannel::ReadingState;
    741772        if (reply)
    742             receiveReply();
     773            _q_receiveReply();
    743774    }
    744775}
     
    759790        state = QHttpNetworkConnectionChannel::ReadingState;
    760791        if (reply)
    761             receiveReply();
     792            _q_receiveReply();
    762793    } else if (state == QHttpNetworkConnectionChannel::IdleState && resendCurrent) {
    763794        // re-sending request because the socket was in ClosingState
     
    842873    }
    843874    QPointer<QObject> that = connection;
    844     QString errorString = connection->d_func()->errorDetail(errorCode, socket);
     875    QString errorString = connection->d_func()->errorDetail(errorCode, socket, socket->errorString());
    845876    if (send2Reply) {
    846877        if (reply) {
  • trunk/src/network/access/qhttpnetworkconnectionchannel_p.h

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
     
    145145
    146146    bool sendRequest();
    147     void receiveReply();
    148147
    149148    bool ensureConnection();
     
    167166
    168167    protected slots:
     168    void _q_receiveReply();
    169169    void _q_bytesWritten(qint64 bytes); // proceed sending
    170170    void _q_readyRead(); // pending data to read
  • trunk/src/network/access/qhttpnetworkheader.cpp

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/src/network/access/qhttpnetworkheader_p.h

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/src/network/access/qhttpnetworkreply.cpp

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
     
    180180{
    181181    Q_D(QHttpNetworkReply);
     182    // we'll take the last buffer, so schedule another read from http
     183    if (d->downstreamLimited && d->responseData.bufferCount() == 1)
     184        d->connection->d_func()->readMoreLater(this);
    182185    return d->responseData.read();
     186}
     187
     188void QHttpNetworkReply::setDownstreamLimited(bool dsl)
     189{
     190    Q_D(QHttpNetworkReply);
     191    d->downstreamLimited = dsl;
     192    d->connection->d_func()->readMoreLater(this);
    183193}
    184194
     
    202212      currentChunkSize(0), currentChunkRead(0), connection(0), initInflate(false),
    203213      autoDecompress(false), responseData(), requestIsPrepared(false)
    204       ,pipeliningUsed(false)
     214      ,pipeliningUsed(false), downstreamLimited(false)
    205215{
    206216}
  • trunk/src/network/access/qhttpnetworkreply_p.h

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
     
    126126    qint64 bytesAvailableNextBlock() const;
    127127    QByteArray readAny();
     128    void setDownstreamLimited(bool t);
    128129
    129130    bool isFinished() const;
     
    230231
    231232    bool pipeliningUsed;
     233    bool downstreamLimited;
    232234};
    233235
  • trunk/src/network/access/qhttpnetworkrequest.cpp

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/src/network/access/qhttpnetworkrequest_p.h

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/src/network/access/qnetworkaccessbackend.cpp

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
     
    162162}
    163163
     164void QNetworkAccessBackend::setDownstreamLimited(bool b)
     165{
     166    Q_UNUSED(b);
     167    // do nothing
     168}
     169
    164170void QNetworkAccessBackend::copyFinished(QIODevice *)
    165171{
  • trunk/src/network/access/qnetworkaccessbackend_p.h

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
     
    117117    // slot-like:
    118118    virtual void downstreamReadyWrite();
     119    virtual void setDownstreamLimited(bool b);
    119120    virtual void copyFinished(QIODevice *);
    120121    virtual void ignoreSslErrors();
  • trunk/src/network/access/qnetworkaccesscache.cpp

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/src/network/access/qnetworkaccesscache_p.h

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/src/network/access/qnetworkaccesscachebackend.cpp

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/src/network/access/qnetworkaccesscachebackend_p.h

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/src/network/access/qnetworkaccessdatabackend.cpp

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/src/network/access/qnetworkaccessdatabackend_p.h

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/src/network/access/qnetworkaccessdebugpipebackend.cpp

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/src/network/access/qnetworkaccessdebugpipebackend_p.h

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/src/network/access/qnetworkaccessfilebackend.cpp

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/src/network/access/qnetworkaccessfilebackend_p.h

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/src/network/access/qnetworkaccessftpbackend.cpp

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/src/network/access/qnetworkaccessftpbackend_p.h

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/src/network/access/qnetworkaccesshttpbackend.cpp

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
     
    145145        pos = end + 1;
    146146
    147         if (equal != -1) {
     147        if (uint(equal) < uint(comma)) {
    148148            // case: token "=" (token | quoted-string)
    149149            // skip spaces
     
    394394        httpRequest.setHeaderField("If-Modified-Since", QNetworkHeadersPrivate::toHttpDate(lastModified));
    395395
    396     it = cacheHeaders.findRawHeader("Cache-Control");
    397     if (it != cacheHeaders.rawHeaders.constEnd()) {
    398         QHash<QByteArray, QByteArray> cacheControl = parseHttpOptionHeader(it->second);
    399         if (cacheControl.contains("must-revalidate"))
    400             return;
    401     }
    402 
     396    if (CacheLoadControlAttribute == QNetworkRequest::PreferNetwork) {
     397        it = cacheHeaders.findRawHeader("Cache-Control");
     398        if (it != cacheHeaders.rawHeaders.constEnd()) {
     399            QHash<QByteArray, QByteArray> cacheControl = parseHttpOptionHeader(it->second);
     400            if (cacheControl.contains("must-revalidate"))
     401                return;
     402        }
     403    }
     404
     405    QDateTime currentDateTime = QDateTime::currentDateTime();
     406    QDateTime expirationDate = metaData.expirationDate();
     407
     408#if 0
    403409    /*
    404410     * age_value
     
    416422     *      is the current (local) time
    417423     */
    418     QDateTime currentDateTime = QDateTime::currentDateTime();
    419424    int age_value = 0;
    420425    it = cacheHeaders.findRawHeader("age");
    421426    if (it != cacheHeaders.rawHeaders.constEnd())
    422         age_value = QNetworkHeadersPrivate::fromHttpDate(it->second).toTime_t();
    423 
     427        age_value = it->second.toInt();
     428
     429    QDateTime dateHeader;
    424430    int date_value = 0;
    425431    it = cacheHeaders.findRawHeader("date");
    426     if (it != cacheHeaders.rawHeaders.constEnd())
    427         date_value = QNetworkHeadersPrivate::fromHttpDate(it->second).toTime_t();
     432    if (it != cacheHeaders.rawHeaders.constEnd()) {
     433        dateHeader = QNetworkHeadersPrivate::fromHttpDate(it->second);
     434        date_value = dateHeader.toTime_t();
     435    }
    428436
    429437    int now = currentDateTime.toUTC().toTime_t();
     
    431439    int response_time = now;
    432440
     441    // Algorithm from RFC 2616 section 13.2.3
    433442    int apparent_age = qMax(0, response_time - date_value);
    434443    int corrected_received_age = qMax(apparent_age, age_value);
     
    439448
    440449    // RFC 2616 13.2.4 Expiration Calculations
    441     QDateTime expirationDate = metaData.expirationDate();
    442450    if (!expirationDate.isValid()) {
    443451        if (lastModified.isValid()) {
     
    454462    }
    455463
    456     int freshness_lifetime = currentDateTime.secsTo(expirationDate);
     464    // the cache-saving code below sets the expirationDate with date+max_age
     465    // if "max-age" is present, or to Expires otherwise
     466    int freshness_lifetime = dateHeader.secsTo(expirationDate);
    457467    bool response_is_fresh = (freshness_lifetime > current_age);
    458 
    459     if (!response_is_fresh && CacheLoadControlAttribute == QNetworkRequest::PreferNetwork)
     468#else
     469    bool response_is_fresh = currentDateTime.secsTo(expirationDate) >= 0;
     470#endif
     471
     472    if (!response_is_fresh)
    460473        return;
    461474
     
    582595        cacheProxy.type() == QNetworkProxy::DefaultProxy) {
    583596        // unsuitable proxies
    584         error(QNetworkReply::ProxyNotFoundError,
    585               tr("No suitable proxy found"));
    586         finished();
     597        QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection,
     598                                  Q_ARG(QNetworkReply::NetworkError, QNetworkReply::ProxyNotFoundError),
     599                                  Q_ARG(QString, tr("No suitable proxy found")));
     600        QMetaObject::invokeMethod(this, "finished", Qt::QueuedConnection);
    587601        return;
    588602    }
     
    642656    if (httpReply && httpReply->bytesAvailable() == 0 && httpReply->isFinished())
    643657        replyFinished();
     658}
     659
     660void QNetworkAccessHttpBackend::setDownstreamLimited(bool b)
     661{
     662    if (httpReply)
     663        httpReply->setDownstreamLimited(b);
    644664}
    645665
  • trunk/src/network/access/qnetworkaccesshttpbackend_p.h

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
     
    8383
    8484    virtual void downstreamReadyWrite();
     85    virtual void setDownstreamLimited(bool b);
     86
    8587    virtual void copyFinished(QIODevice *);
    8688#ifndef QT_NO_OPENSSL
     
    105107    void httpError(QNetworkReply::NetworkError error, const QString &errorString);
    106108    bool sendCacheContents(const QNetworkCacheMetaData &metaData);
     109    void finished(); // override
    107110
    108111private:
     
    119122
    120123    void disconnectFromHttp();
    121     void finished();            // override
    122124    void setupConnection();
    123125    void validateCache(QHttpNetworkRequest &httpRequest, bool &loadedFromCache);
  • trunk/src/network/access/qnetworkaccessmanager.cpp

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
     
    688688    // The QNetworkAccessFileBackend will right now only be used
    689689    // for PUT or qrc://
    690     if (op == QNetworkAccessManager::GetOperation
     690    if ((op == QNetworkAccessManager::GetOperation || op == QNetworkAccessManager::HeadOperation)
    691691         && (req.url().scheme() == QLatin1String("file")
    692692             || req.url().scheme().isEmpty())) {
    693         return new QFileNetworkReply(this, req);
     693        return new QFileNetworkReply(this, req, op);
    694694    }
    695695
     
    724724    priv->backend = d->findBackend(op, request);
    725725
    726     // fourth step: setup the reply
    727     priv->setup(op, request, outgoingData);
    728726#ifndef QT_NO_NETWORKPROXY
    729727    QList<QNetworkProxy> proxyList = d->queryProxy(QNetworkProxyQuery(request.url()));
     
    734732        priv->backend->reply = priv;
    735733    }
     734    // fourth step: setup the reply
     735    priv->setup(op, request, outgoingData);
    736736
    737737#ifndef QT_NO_OPENSSL
  • trunk/src/network/access/qnetworkaccessmanager.h

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/src/network/access/qnetworkaccessmanager_p.h

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/src/network/access/qnetworkcookie.cpp

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/src/network/access/qnetworkcookie.h

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/src/network/access/qnetworkcookie_p.h

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/src/network/access/qnetworkcookiejar.cpp

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/src/network/access/qnetworkcookiejar.h

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/src/network/access/qnetworkcookiejar_p.h

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/src/network/access/qnetworkdiskcache.cpp

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/src/network/access/qnetworkdiskcache.h

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/src/network/access/qnetworkdiskcache_p.h

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/src/network/access/qnetworkreply.cpp

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
     
    240240    signal. Use deleteLater().
    241241
    242     \sa QNetworkAccessManager::finished()
     242    You can also use isFinished() to check if a QNetworkReply
     243    has finished even before you receive the finished() signal.
     244
     245    \sa QNetworkAccessManager::finished(), isFinished()
    243246*/
    244247
  • trunk/src/network/access/qnetworkreply.h

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/src/network/access/qnetworkreply_p.h

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/src/network/access/qnetworkreplyimpl.cpp

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
     
    7373    state = Working;
    7474
     75    // note: if that method is called directly, it cannot happen that the backend is 0,
     76    // because we just checked via a qobject_cast that we got a http backend (see
     77    // QNetworkReplyImplPrivate::setup())
    7578    if (!backend) {
    7679        error(QNetworkReplyImpl::ProtocolUnknownError,
     
    203206    }
    204207}
    205 
    206208
    207209void QNetworkReplyImplPrivate::setup(QNetworkAccessManager::Operation op, const QNetworkRequest &req,
     
    247249        // or no backend
    248250        // if no backend, _q_startOperation will handle the error of this
    249         QMetaObject::invokeMethod(q, "_q_startOperation", Qt::QueuedConnection);
     251
     252        // for HTTP, we want to send out the request as fast as possible to the network, without
     253        // invoking methods in a QueuedConnection
     254        if (qobject_cast<QNetworkAccessHttpBackend *>(backend)) {
     255            _q_startOperation();
     256        } else {
     257            QMetaObject::invokeMethod(q, "_q_startOperation", Qt::QueuedConnection);
     258        }
    250259    }
    251260
     
    644653
    645654    QNetworkReply::setReadBufferSize(size);
     655
     656    if (d->backend)
     657        d->backend->setDownstreamLimited(d->readBufferMaxSize > 0);
    646658}
    647659
  • trunk/src/network/access/qnetworkreplyimpl_p.h

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/src/network/access/qnetworkrequest.cpp

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/src/network/access/qnetworkrequest.h

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/src/network/access/qnetworkrequest_p.h

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
Note: See TracChangeset for help on using the changeset viewer.