2012-06-22 51 views
5

用戶可以將文檔發佈到我們的Web服務。我們將它在其他地方流。但是,在流媒體播放結束時,我們需要確保他們不會說謊他們的內容長度。如何根據Content-Length標題檢查實際內容長度?

我假設,如果headerContentLength > realContentLength,請求會等待他們發​​送其餘的,最終超時。所以這可能是好的。

如果headerContentLength < realContentLength?即如果他們說他們完成後繼續發送數據呢?

這是否由Node.js以任何方式照顧?如果不是,有什麼好方法檢查?我想我可以只計算一些data事件監聽器中的字節,即req.on("data", function (chunk) { totalBytes += chunk.length; })。這看起來像一個雜物。

+0

您是否沒有對請求的'end'事件執行此檢查,因爲您希望在客戶端發送比指定的content-length頭部更多的數據時立即終止連接? – cjohn

+0

我很樂意在'end'事件中執行檢查,但我不知道要訪問什麼屬性來告知真正發送了多少個字節。 'http.ServerRequest'似乎沒有任何這樣的屬性。 – Domenic

回答

2

要檢查請求的實際長度,您必須自行添加它。 data塊是Buffer s,他們有一個.length財產,你可以加起來。

如果您使用request.setEncoding()指定編碼,您的data塊將代替String。在這種情況下,請致電Buffer.byteLength(chunk)以獲取長度。 (Buffer是節點中的全局對象。)

將每個塊的總和相加,您就會知道發送了多少數據。 這裏有一個粗略的(未經測試)例如:

https.createServer(function(req, res) { 
    var expected_length = req.headers['content-length']; // I think this is a string ;) 
    var actual_length = 0; 
    req.on('data', function (chunk) { 
     actual_length += chunk.length; 
    }); 
    req.on('end', function() { 
     console.log('expected: ' + expected_length + ', actual: ' + actual_length); 
    }); 
}); 

注:lengthBuffer的內容,而不是實際長度的最大長度。但是,它在這種情況下起作用,因爲塊緩衝區總是以完全正確的長度創建。請注意,如果你在其他地方使用緩衝區。