[英]Add size limit to QNetworkReply
在我使用Qt5完成的应用程序中,当我从Internet下载数据时,我想设置一个安全系统。 首先,我想检查我正在下载多少字节,如果是这种情况,则中止。 我想设置最大下载字节数限制,如果超过则中止。
我正在使用QNetworkReply类。
首先,我检查了size()函数,但是到那时,我已经收到了所有数据(请求已完成),所以这还不够。
第二次检查,我查看了信号downloadProgress(qint64 bytesReceived,qint64 bytesTotal) 。 但是,我可以检查并中止bytesReceived太大。 但是我不确定有两个动机:首先,如文档中所述
请注意,bytesReceived和bytesTotal的值都可能与size(),通过read()或readAll()获得的字节总数或标头的值(ContentLengthHeader)不同。 这样做的原因是在下载过程中可能会有协议开销或压缩数据。
其次,我不知道何时会收到此信号。...可能为时已晚...
最后,我检查了setReadBufferSize(qint64 size) 。 看来这是一个不错的解决方案,但是我不确定文档中的以下两行:首先,
一旦此缓冲区已满,QNetworkReply将尝试停止从网络读取(即,bytesAvailable()返回大小或更大)
尝试是什么意思? 我应该依靠它吗?
第二,
与QAbstractSocket :: setReadBufferSize()不同,QNetworkReply无法保证读取缓冲区大小的精度。 也就是说,bytesAvailable()可以返回的大小超过size。
因此,似乎我不能依靠精确的限制来进行设置。
有人可以建议我最好的实施方法吗?
我发现的最佳解决方案是使用readyRead信号( QNetworkReply从QIODevice派生),然后由我自己在一个slot
实施安全检查:
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;
为了不至于在末尾留下一些字节是必需的,因为我们在onReadyRead
里面,这是一个连接到readyRead
和文档的slot
:
readyRead()不会递归地发出; 如果您重新进入事件循环或在连接到readyRead()信号的插槽内调用waitForReadyRead(),则不会重新发出该信号(尽管waitForReadyRead()可能仍返回true)。
PS:我仍然对更好的解决方案持开放态度,这些解决方案可能来自Qt
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.