2012-06-22 9 views
5

Un usuario puede ENVIAR un documento a nuestro servicio web. Lo transmitimos a otra parte. Pero, al final de la transmisión, debemos asegurarnos de que no mintieron sobre su longitud de contenido.¿Cómo verificar la longitud real del contenido contra el encabezado Content-Length?

Supongo que si headerContentLength > realContentLength, la solicitud simplemente esperará a que envíen el resto, con el tiempo de espera. Entonces eso es probablemente correcto.

¿Qué pasa si headerContentLength < realContentLength? Es decir. ¿Qué pasa si siguen enviando datos después de que dijeron que habían terminado?

¿Está esto cuidado por Node.js de alguna manera? Si no, ¿cuál es una buena manera de verificar? Supongo que podría contar los bytes dentro de algunos escuchas de eventos data --- es decir, req.on("data", function (chunk) { totalBytes += chunk.length; }). Aunque eso parece un poco complicado.

+0

¿No está realizando esta comprobación en el evento 'end' de la solicitud porque quiere finalizar la conexión inmediatamente en caso de que el cliente envíe más datos que el encabezado' content-length' especificado? – cjohn

+0

Estaría encantado de realizar el control en el evento 'end', pero no sé a qué propiedad acceder para decir cuántos bytes realmente se enviaron. 'http.ServerRequest' no parece tener ninguna de esas propiedades. – Domenic

Respuesta

2

Para verificar la duración real de la solicitud, debe agregarla usted mismo. Los trozos data son Buffer sy tienen una propiedad .length que puede sumar.

Si especifica la codificación con request.setEncoding(), su data trozos será String s en su lugar. En ese caso, llame al Buffer.byteLength(chunk) para obtener la longitud. (Buffer es un objeto global en el nodo.)

Sume el total de cada uno de sus fragmentos y sabrá la cantidad de datos enviados. Aquí está un ejemplo rugosa (no probado):

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

Nota: length se refiere a la longitud máxima de contenido de la Buffer 's, no la longitud real. Sin embargo, funciona en este caso porque los almacenamientos intermedios de fragmentos siempre se crean a la longitud correcta exacta. Solo tenlo en cuenta si trabajas con buffers en otro lado.

Cuestiones relacionadas