2009-11-04 14 views
5

Me gustaría saber la cantidad de datos enviados en respuesta a una determinada solicitud HTTP. Lo que actualmente lo que hago es la siguiente:Obtenga el tamaño de la respuesta HTTP en Java

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 está configurado. P.ej. cuando el servidor usa la codificación de transferencia = fragmentada, recupero un valor de -1.

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

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

Respuesta

8

Utilizaría un commons-io CountingInputStream, que haría el trabajo por 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); 
    } 
} 
+0

Gracias eso es exactamente lo que necesitaba. Y con Maven una dependencia más no va a doler ;-) – er4z0r

2

Se puede extender FilterInputStream, anulando los read(), read(byte[],int,int) y skip métodos de manera que después de llamar a la forma super, actualizan un contador con el número de bytes leídos.

Luego ajuste el flujo de entrada devuelto por URLConnection con uno de estos y utilice el contenedor en lugar de la transmisión original. Cuando hayas terminado, puedes consultar el contador de wrapper.

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

+0

Gracias por su respuesta! Debo admitir que no soy un codificador muy bueno y muy perezoso. No me gusta inventar mi propia rueda/truco para esto. Para evitar errores y ahorrar tiempo, usaré CountingInputStream de commons-io como una solución establecida. ¡Gracias de nuevo por su tiempo! – er4z0r

Cuestiones relacionadas