QtWebkit: How to check HTTP status code?

Martin picture Martin · Dec 2, 2010 · Viewed 9.9k times · Source

I'm writing a thumbnail generator as per an example in the QtWebkit documentation. I would like to avoid screenshots of error pages such as 404 not found or 503 Internal server error.

However, the QWebPage::loadFinished() signal is always emitted with ok = true even when the page gives an HTTP error. Is there a way in QtWebkit to check the HTTP status code on a response?

Answer

Martin picture Martin · Dec 2, 2010

Turns out you need to monitor the QNetworkAccessManager associated with your QWebPage and wait for a finished(...) signal. You can then inspect the HTTP response and check its status code by asking for the QNetworkRequest::HttpStatusCodeAttribute attribute.

It's better explained in code:

void MyClass::initWebPage()
{
  myQWebPage = new QWebPage(this);
  connect(
    myQWebPage->networkAccessManager(), SIGNAL(finished(QNetworkReply *)),
    this, SLOT(httpResponseFinished(QNetworkReply *))
  );
}

void MyClass::httpResponseFinished(QNetworkReply * reply)
{
  switch (reply->error())
  {
    case QNetworkReply::NoError:
      // No error
      return;
    case QNetworkReply::ContentNotFoundError:
      // 404 Not found
      failedUrl = reply->request.url();
      httpStatus = reply->attribute(
        QNetworkRequest::HttpStatusCodeAttribute).toInt();
      httpStatusMessage = reply->attribute(
        QNetworkRequest::HttpReasonPhraseAttribute).toByteArray();
      break;
    }
}

There are more NetworkErrors to choose from, e.g. for TCP errors or HTTP 401.