2012-06-22 19 views
5

Bir kullanıcı web servisimize bir belgeyi gönderebilir. Başka bir yere akıtıyoruz. Ancak, akış sonunda, İçerik Uzunluğu hakkında yalan söylemediğinden emin olmalıyız.Gerçek içerik uzunluğunu Content-Length başlığına göre nasıl kontrol edilir?

headerContentLength > realContentLength numaralı telefonun isteğinin geri kalanını göndermesini bekler, sonuçta zaman aşımına uğrar. Yani muhtemelen sorun yok.

headerContentLength < realContentLength nedir? Yani ne yaptıklarını söyledikten sonra veri göndermeye devam ederse ne olur?

Bu, Node.js tarafından herhangi bir şekilde ele alınmış mı? Değilse, kontrol etmek için iyi bir yol nedir? Sanırım sadece data olay dinleyicisinin içindeki baytları sayabilirim --- yani, req.on("data", function (chunk) { totalBytes += chunk.length; }). Bu olsa bir kludge gibi görünüyor.

+0

İstemcinin "content-length" başlığından daha fazla veri gönderiyor olması durumunda, bağlantıyı hemen sonlandırmak istediğiniz için bu denetimi ''' 'request' olayında gerçekleştirmiyor musunuz? – cjohn

+0

"Son" olayındaki çekmeyi yapmaktan memnuniyet duyarız, ancak kaç baytın gerçekten gönderildiğini bildirmek için hangi özelliklerin kullanılacağını bilmiyorum. 'http.ServerRequest' böyle bir özelliği yok gibi görünüyor. – Domenic

cevap

2

İsteğin gerçek uzunluğunu kontrol etmek için, onu kendiniz eklemelisiniz. data parçaları Buffer s ve ekleyebileceğiniz bir .length özelliğine sahiptir.

request.setEncoding() ile kodlamayı belirtirseniz, data parçalarınız bunun yerine String s olacaktır. Bu durumda, uzunluğu almak için Buffer.byteLength(chunk) numaralı telefonu arayın. (Buffer, düğümde genel bir nesnedir.)

Her bir topluluğunuzun toplamını toplayın ve ne kadar veri gönderildiğini bileceksiniz. Burada kaba (denenmemiş) örnek:

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); 
    }); 
}); 

Not

: length Buffer içeriğiyle değil, gerçek uzunluğu maksimum uzunluğunu ifade eder. Ancak, bu durumda çalışır, çünkü yığın tamponlar her zaman tam doğru uzunlukta oluşturulur. Sadece başka bir yerde arabelleklerle çalışıyorsanız farkında olun.

İlgili konular