将大小限制添加到QNetworkReply

时间:2018-07-13 08:31:56

标签: c++ qt security qnetworkreply websecurity

在使用Qt5完成的应用程序中,当我从Internet下载数据时,我想设置一个安全系统。首先,我想检查我正在下载多少字节,如果是这种情况,则中止。我想设置最大下载字节数限制,如果超出限制则中止。

我正在使用QNetworkReply类。

首先,我检查了size()函数,但是到那时,我已经收到了所有数据(请求已完成),所以这还不够。

第二次检查,我查看了信号downloadProgress(qint64 bytesReceived, qint64 bytesTotal)。但是,我可以检查并中止bytesReceived太大。但是我不确定有两个动机:首先,如文档中所述

  

请注意,bytesReceived和bytesTotal的值都可能与size(),通过read()或readAll()获得的字节总数或标头的值(ContentLengthHeader)不同。这样做的原因是在下载过程中可能会产生协议开销或压缩数据。

第二,我不知道何时我会收到此信号。...也许为时已晚...

最后,我检查了setReadBufferSize(qint64 size)。这似乎是一个很好的解决方案,但是我不确定文档中的以下两行: 首先,

  

一旦该缓冲区已满(即,bytesAvailable()返回大小或更大),QNetworkReply将尝试停止从网络读取

try 是什么意思?我应该依靠它吗?

  

与QAbstractSocket :: setReadBufferSize()不同,QNetworkReply无法保证读取缓冲区大小的精度。也就是说,bytesAvailable()可以返回的大小超出了大小。

所以,看来我不能依靠精确的限制来设置。

有人可以建议我实施该方法的最佳方法吗?

1 个答案:

答案 0 :(得分:0)

我发现的最佳解决方案是使用readyRead信号(QNetworkReply源自QIODevice),然后由我自己在slot中实施安全检查:< / p>

void onReadyRead()
{
    for (;;)
    {
        QByteArray currentDataRead = httpReply->read(100); // Just read some bytes
        if ( currentDataRead.isEmpty() )
            return;

        myResponseBody.append(currentDataRead);
        if (myResponseBody.size() > myMaxResponseSize) // check my limit
        {
            qDebug() << "Error: response size bigger than expected - aborting";
            httpReply->abort();
        }
    }
}

注意:需要inifite for(;;)循环和校验if ( currentDataRead.isEmpty() ) return;以便末尾不遗漏一些字节,因为我们位于{{1 }}连接到onReadyRead并来自文档:

  

readyRead()不会递归发出;如果您重新进入事件循环或在连接到readyRead()信号的插槽内调用waitForReadyRead(),则不会重新发出该信号(尽管waitForReadyRead()可能仍返回true)。

--------------------

PS:我仍然愿意接受更好的解决方案,可能是Qt原生的