Domanda

Mi piacerebbe sapere quanti dati è stato inviato in risposta ad una certa http-request. Quello che attualmente faccio è questa:

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

// controlla la risposta per il contenuto-size    int feedsize = con.getContentLength ();

Il problema è, che il contenuto-legnth non è sempre impostato. Per esempio. quando il server utilizza transfer-encoding = chunked torno un valore di -1.

Lo faccio non bisogno di questo per visualizzare le informazioni di avanzamento. Ho solo bisogno di conoscere la dimensione dei dati che mi è stata inviata dopo che è stato fatto.

Sfondo:. Ho bisogno di queste informazioni perché vorrei confrontarlo con le dimensioni di una risposta, che è stato inviato utilizzando la codifica gzip

È stato utile?

Soluzione

mi piacerebbe utilizzare un commons-io CountingInputStream , che fare il lavoro per voi. Un esempio completo ma banale:

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);
  }
}

Altri suggerimenti

È possibile estendere FilterInputStream, ignorando le read(), read(byte[],int,int) e metodi skip in modo che dopo aver chiamato la forma super, aggiornano un contatore con il numero di byte letti.

Poi avvolgere il flusso di input restituito da URLConnection con uno di questi, e utilizzare l'involucro al posto del flusso originale. Quando hai finito, è possibile interrogare di involucro suo contatore.

Altro ( "manuale") si avvicina sarebbe utilizzare uno strumento come YSlow per raccogliere le statistiche in un browser, o Wireshark per esaminare il traffico sulla rete.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top