Obtener Tamaño de respuesta HTTP en Java
-
16-09-2019 - |
Pregunta
Me gustaría saber la cantidad de datos que se envía en respuesta a una determinada petición http. Actualmente lo que hago es la siguiente:
HttpURLConnection con = (HttpURLConnection) feedurl.openConnection();
// comprobar la respuesta por el contenido de tamaño int feedsize = con.getContentLength ();
El problema es, que el contenido-legnth no siempre se establece. P.ej. cuando el servidor utiliza la transferencia-encoding = fragmentada que vuelva un valor de -1.
hago no necesita esto para mostrar información de progreso. Sólo necesito saber el tamaño de los datos que me fue enviado después de que se ha hecho.
Antecedentes:. Necesito esta información porque me gustaría compararlo con el tamaño de una respuesta, que fue enviado a través de gzip codificación
Solución
que haría uso de un commons-io CountingInputStream, lo que haría el trabajo para usted. Un ejemplo completo pero trivial:
public long countContent(URL feedurl) {
CountingInputStream counter = null;
try {
HttpURLConnection con = (HttpURLConnection) feedurl.openConnection();
counter = new CountingInputStream(con.getInputStream());
String output = IOUtils.toString(counter);
return counter.getByteCount();
} catch (IOException ex) {
throw new RuntimeException(ex);
} finally {
IOUtils.closeQuietly(counter);
}
}
Otros consejos
Se puede extender FilterInputStream
, anulando los read()
, read(byte[],int,int)
y métodos skip
de manera que después de llamar a la forma super
, actualizan un contador con el número de bytes leídos.
Luego envuelva el flujo de entrada devuelto por URLConnection
con uno de estos, y el uso de la envoltura en lugar del flujo original. Cuando haya terminado, puede consultar su contador de envoltorio.
Otros ( "Manual") se acerca sería utilizar una herramienta como YSlow para recopilar estadísticas en un navegador, o Wireshark para examinar el tráfico en la red.