[英]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.