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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top