Pregunta Obtener el tamaño de la respuesta HTTP en Java


Me gustaría saber cuántos datos se enviaron en respuesta a una determinada solicitud de http. Lo que hago actualmente es esto:

   HttpURLConnection con = (HttpURLConnection) feedurl.openConnection();

// verifica la respuesta para el tamaño del contenido    int feedsize = con.getContentLength ();

El problema es que ese contenido no siempre se establece. P.ej. cuando el servidor usa transfer-encoding = chunked recupero un valor de -1.

hago no Necesito esto para mostrar información de progreso. Solo necesito saber el tamaño de los datos que me enviaron después de que se haya realizado.

Antecedentes: Necesito esta información porque me gustaría compararla con el tamaño de una respuesta que se envió usando la codificación gzip.


5
2017-11-04 14:35


origen


Respuestas:


Yo usaría un commons-io CountingInputStream, que haría el trabajo por ti. 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);
  }
}

8
2017-11-04 14:43



Puedes extender FilterInputStream, anulando el read(), read(byte[],int,int)y skip Métodos para que luego de llamar al super De esta forma, actualizan un contador con el número de bytes leídos.

A continuación, ajuste la secuencia de entrada devuelta por URLConnection con uno de estos, y use la envoltura en lugar del flujo original. Cuando hayas terminado, puedes consultar el envoltorio de su contador.

Otros enfoques ("manuales") serían utilizar una herramienta como YSlow para recopilar estadísticas en un navegador, o Wireshark para examinar el tráfico en la red.


2
2017-11-04 14:42