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

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top