0

I just noticed that when I try to send http request while there are already http requests going on in the background, one of them stops and waits until the previous one will finish. They both use their own QNetworkAccessManagers. Can anyone explain why this is happening?

UPDATE i must doing here something wrong and i don't know , here some code .
there are 2 http post functions the first is simple post that invoked every 5 sec and the second one is file upload post function that call in parallel.
when i call the file upload the first stops , whits until the file upload finished and continue this is come's from Qt with out my intervention . this is with single QNetworkAccessManager

    //Init in the class contractor

     networkManager = new QNetworkAccessManager(this); 
     connect(networkManager,SIGNAL(sslErrors(QNetworkReply*,QList<QSslError>)), this, SLOT(on_sslErr(QNetworkReply*,QList<QSslError>)));


    //-----------------------------------------------------\\

    //this is upload file code , its taking time untill it finish working great

    PostImageRequest( QString& Response,
                                    QMap<QString,QString> paramsToPostMap,
                                    QString& BaseUrl,
                                    QString imageFullPath,
                                    int iTimeOutInterval)


    QByteArray imageFormat = QImageReader::imageFormat(imageFullPath);
    QString imageMimeType(imageFormat);
    QNetworkRequest request;
    QUrl params;
    QMapIterator<QString,QString> i(paramsToPostMap);
    while (i.hasNext()) {
        i.next();
        addField(i.key(),i.value());
    }

      addFile("file",imageFullPath,imageMimeType);
      QString crlf="\r\n";
      qsrand(QDateTime::currentDateTime().toTime_t());
      QString b=QVariant(qrand()).toString()+QVariant(qrand()).toString()+QVariant(qrand()).toString();
      QString boundary="---------------------------"+b;
      QString endBoundary=crlf+"--"+boundary+"--"+crlf;
      QString contentType="multipart/form-data; boundary="+boundary;
      boundary="--"+boundary+crlf;
      QByteArray bond=boundary.toAscii();
      QByteArray send;
      bool first=true;

      for (int i=0; i<fieldNames.size(); i++) {
        send.append(bond);
        if (first) {
          boundary=crlf+boundary;
          bond=boundary.toAscii();
          first=false;
        }
        send.append(QString("Content-Disposition: form-data; name=\""+fieldNames.at(i)+"\""+crlf).toAscii());
        if (encodingS=="utf-8") send.append(QString("Content-Transfer-Encoding: 8bit"+crlf).toAscii());
        send.append(crlf.toAscii());
        send.append(strToEnc(fieldValues.at(i)));
      }
      for (int i=0; i<files.size(); i++) {
        send.append(bond);
        send.append(QString("Content-Disposition: form-data; name=\""+fileFieldNames.at(i)+"\"; filename=\""+fileNames.at(i)+"\""+crlf).toAscii());
        send.append(QString("Content-Type: "+fileMimes.at(i)+crlf+crlf).toAscii());
        send.append(files.at(i));  
      }

      send.append(endBoundary.toAscii());

      fieldNames.clear();
      fieldValues.clear();
      fileFieldNames.clear();
      fileNames.clear();
      fileMimes.clear();
      files.clear();
     request.setHeader(QNetworkRequest::ContentTypeHeader, contentType.toAscii());
 request.setHeader(QNetworkRequest::ContentLengthHeader, QVariant(send.size()).toString());
     request.setUrl(BaseUrl);


     if(iTimeOutInterval != -1)
     {
         QEventLoop loop2;
         QTimer::singleShot(iTimeOutInterval, &loop2, SLOT(quit()) );
         loop2.exec();
 }
     QEventLoop loop;
     QNetworkReply *reply = networkManager->post(request,send);
     connect(reply, SIGNAL(uploadProgress(qint64,qint64)), this,SLOT(SetProgress(qint64,qint64)));
     connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
 loop.exec();       
     //return response 
     QNetworkReply::NetworkError networkError = reply->error();
     HandleNetworkError(networkError); 
     Response.clear();
     QByteArray data=reply->readAll();
     Response.append(data);
     //delete reply;
     reply->deleteLater();

    //--------------------------------------------------------------------------------\\

//this is the post function that invoket every 5 secound

    PostRequest(QString& Response,
                            QMap<QString,QString> paramsToPostMap,
                            QString& BaseUrl,
                            int iTimeOutInterval)


     QNetworkRequest request;
     QUrl params;
     QMapIterator<QString,QString> i(paramsToPostMap);
     while (i.hasNext()) {
        i.next();
        params.addQueryItem(i.key(),i.value());
     }
     request.setUrl(BaseUrl);

     QByteArray postArgs;
     postArgs = params.encodedQuery();

     if(iTimeOutInterval != -1)
     {
         QEventLoop loop2;
         QTimer::singleShot(iTimeOutInterval, &loop2, SLOT(quit()) );
         loop2.exec();
 }
     QEventLoop loop;
     QNetworkReply *reply = networkManager->post(request,postArgs);
     connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
 loop.exec();       
     //return response 
     QNetworkReply::NetworkError networkError = reply->error();
     HandleNetworkError(networkError); 
     Response.clear();
     QByteArray data=reply->readAll();
     Response.append(data);


     //delete reply;
     reply->deleteLater(); 
5
  • And don't use multiple instances of QNetworkAccessManager. It's designed to be shared and having multiple instances is expensive. Commented Aug 12, 2011 at 7:36
  • 2
    From the Qt 4.7 reference: QNetworkAccessManager queues the requests it receives. The number of requests executed in parallel is dependent on the protocol. Currently, for the HTTP protocol on desktop platforms, 6 requests are executed in parallel for one host/port combination. Commented Aug 12, 2011 at 7:39
  • @Purnima: You can post the link to the doccumentation and post it as an answer, I think it answers the Question. Oh If you did so, You would have my upvote. :) Commented Aug 12, 2011 at 7:42
  • im defiantly doing here something wrong im posing my http request code it is inside a singleton class Commented Aug 12, 2011 at 8:48
  • I think you need to create a minimum version of code recreating your problem, the code now seems to be too complicated. Commented Aug 12, 2011 at 16:29

1 Answer 1

3

From the Qt 4.7 reference:

QNetworkAccessManager queues the requests it receives. The number of requests executed in parallel is dependent on the protocol. Currently, for the HTTP protocol on desktop platforms, 6 requests are executed in parallel for one host/port combination.

Sign up to request clarification or add additional context in comments.

1 Comment

i know this but i have less then 6

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.