天天看點

QT分析之HTTP請求

分析QNetworkAccessManager的時候,有一段設定HTTP的請求包的Header,當時沒進行深入的分析。

void QHttpNetworkConnectionPrivate::prepareRequest(HttpMessagePair &messagePair)

{

    QHttpNetworkRequest &request = messagePair.first;

    QHttpNetworkReply *reply = messagePair.second;

    // add missing fields for the request

    QByteArray value;

    // check if Content-Length is provided

    QIODevice *data = request.data();

    if (data && request.contentLength() == -1) {

        if (!data->isSequential())

            request.setContentLength(data->size());

        else

            bufferData(messagePair); // ### or do chunked upload

    }

    // set the Connection/Proxy-Connection: Keep-Alive headers

#ifndef QT_NO_NETWORKPROXY

    if (networkProxy.type() == QNetworkProxy::HttpCachingProxy)  {

        value = request.headerField("proxy-connection");

        if (value.isEmpty())

            request.setHeaderField("Proxy-Connection", "Keep-Alive");

    } else {

#endif

        value = request.headerField("connection");

            request.setHeaderField("Connection", "Keep-Alive");

    // If the request had a accept-encoding set, we better not mess

    // with it. If it was not set, we announce that we understand gzip

    // and remember this fact in request.d->autoDecompress so that

    // we can later decompress the HTTP reply if it has such an

    // encoding.

    value = request.headerField("accept-encoding");

    if (value.isEmpty()) {

#ifndef QT_NO_COMPRESS

        request.setHeaderField("Accept-Encoding", "gzip");

        request.d->autoDecompress = true;

#else

        // if zlib is not available set this to false always

        request.d->autoDecompress = false;

    // set the User Agent

    value = request.headerField("user-agent");

    if (value.isEmpty())

        request.setHeaderField("User-Agent", "Mozilla/5.0");

    // set the host

    value = request.headerField("host");

        QByteArray host = QUrl::toAce(hostName);

        int port = request.url().port();

        if (port != -1) {

            host += ':';

            host += QByteArray::number(port);

        }

        request.setHeaderField("Host", host);

    reply->d_func()->requestIsPrepared = true;

}

如果想模拟IE浏覽器,或者想修改成任何你希望的資訊,就是在這裡修改。

在設定了這些請求資訊之後,發送的請求資訊包是什麼樣子的呢?我把工具攔截的資訊包具體情況貼出來:

http://img245.ph.126.net/M3QJZ0H3fOWN7lMkqpUv3Q==/2110217900400898473.jpg