Search code examples
c++timeoutqnetworkaccessmanager

QNetworkReply and QNetworkAccessManager timeout in http request


How do I setup a timeout when I do an http request?

I have this code:

{
    QNetworkRequest request;

    request.setUrl(QUrl("http://www.foo.com"));
    request.setRawHeader("User-Agent", USER_AGENT.toUtf8());
    request.setRawHeader("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7");
    request.setRawHeader("Accept",
        "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
    request.setRawHeader("Accept-Language", "en-us,en;q=0.5");
    request.setRawHeader("Connection", "Keep-Alive");

    reply = m_networkManager->get(request);
    QEventLoop loop;
    connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
    loop.exec();
}

Where and how do I setup some kind of timeout to the request?


Solution

  • QTimer timer;    
    timer.setSingleShot(true);
    
    QEventLoop loop;
    connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit()));
    connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
    timer.start(30000);   // 30 secs. timeout
    loop.exec();
    
    if(timer.isActive()) {
        timer.stop();
        if(m_reply->error() > 0) {
          ... // handle error
        }
        else {      
          int v = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
    
          if (v >= 200 && v < 300) {  // Success
            ...
          }
        }
    } else {
       // timeout
       disconnect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
    
       reply->abort();
    }