Obtenha o tamanho da resposta HTTP em Java
-
16-09-2019 - |
Pergunta
Eu gostaria de saber quantos dados foram enviados em resposta a uma certa solicitação HTTP. O que eu faço atualmente é o seguinte:
HttpURLConnection con = (HttpURLConnection) feedurl.openConnection();
// Verifique a resposta para o conteúdo-size int feedSize = con.getContentLength ();
O problema é que nem sempre é definido o conteúdo. Por exemplo, quando o servidor usa codificação de transferência = chunked, retiro um valor de -1.
Eu faço não Precisa disso para exibir informações de progresso. Eu só preciso saber o tamanho dos dados que foram enviados para mim depois que foram feitos.
Antecedentes: preciso dessas informações porque gostaria de compará -las com o tamanho de uma resposta, que foi enviada usando a codificação GZIP.
Solução
Eu usaria um Commons-Io contingInputStream, o que faria o trabalho para você. Um exemplo completo, mas 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);
}
}
Outras dicas
Você pode se estender FilterInputStream
, substituindo o read()
, read(byte[],int,int)
, e skip
métodos para que depois de ligar para o super
Formulário, eles atualizam um contador com o número de bytes lidos.
Em seguida, embrulhe o fluxo de entrada retornado por URLConnection
com um deles e use o invólucro no lugar do fluxo original. Quando terminar, você pode consultar o seu balcão.
Outras abordagens ("manuais") seriam usadas uma ferramenta como o YSLOW para reunir estatísticas em um navegador ou Wireshark para examinar o tráfego na rede.