-
Bug
-
Resolution: Done
-
P2: Important
-
4.8.6, 5.6.0
-
None
-
511623b6f065d1ac633af66926150f35676be498
If you don't specify in HTTP GET request header Accept-Encoding as gzip using QNetworkRequest API and let Qt set it automatically, then you will not be able to read Content-length attribute from the reponse although it is received.
Code that reproduces it in my environment:
QNetworkAccessManager manager;
QUrl url("http://192.168.1.83:8090/v1/areas/a70b07c1-eb23-11e3-afd1-080027f0eec3/locations");
QNetworkRequest request(url);
request.setRawHeader("Authorization", getHttpAuthorization().toLocal8Bit());
request.setRawHeader("Accept", "application/json");
request.setRawHeader("Accept-Charset", "utf-8");
//request.setRawHeader("Accept-Encoding", "gzip");
request.setRawHeader("If-None-Match", "dummy_etag");
QNetworkReply* reply = manager.get(request);
std::function<void ()> onFinished = [=]() {
qDebug() << "raw Content-Length: " << reply->rawHeader("Content-Length")
<< " known header: " << reply->header(QNetworkRequest::ContentLengthHeader);
};
QtSignalForwarder::connect(reply, SIGNAL(finished()), onFinished);
QObject::connect(reply, SIGNAL(finished()), reply, SLOT(deleteLater()));
QEventLoop loop;
QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
loop.exec();
Output:
raw Content-Length: "" known header: QVariant(, )
HTTP request and response from Wireshark:
GET /v1/areas/a70b07c1-eb23-11e3-afd1-080027f0eec3/locations HTTP/1.1
Authorization: Basic MDAxNzlkMDA2NjAwMDAwMTo=
Accept: application/json
Accept-Charset: utf-8
If-None-Match: dummy_etag
Connection: Keep-Alive
Accept-Encoding: gzip
Accept-Language: en-US,*
User-Agent: Mozilla/5.0
Host: 192.168.1.83:8090
HTTP/1.1 200 OK
Date: Wed, 08 Oct 2014 12:08:50 GMT
Content-Type: application/json; charset=utf-8
Content-Encoding: gzip
ETag: "14283"
Content-Length: 273176
If you uncomment request.setRawHeader("Accept-Encoding", "gzip");
then in output you will get:
raw Content-Length: "273176" known header: QVariant(qlonglong, 273176)