簡體   English   中英

將大小限制添加到QNetworkReply

[英]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信號( QNetworkReplyQIODevice派生),然后由我自己在一個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM