2009-11-04 15 views
5

Vorrei sapere quanti dati sono stati inviati in risposta a una determinata richiesta http. Quello che attualmente faccio è questa:Ottenere la dimensione della risposta HTTP in Java

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

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

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

I do non necessario per visualizzare informazioni sull'avanzamento. Ho solo bisogno di sapere la dimensione dei dati che mi sono stati inviati dopo che è stato fatto.

Sfondo: ho bisogno di queste informazioni perché vorrei confrontarlo con le dimensioni di una risposta, che è stata inviata usando la codifica gzip.

risposta

8

Vorrei usare uno commons-io CountingInputStream, che farebbe 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); 
    } 
} 
+0

Grazie, è esattamente ciò di cui avevo bisogno. E con Maven un'altra dipendenza non farà male ;-) – er4z0r

2

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

Quindi avvolgere il flusso di input restituito da URLConnection con uno di questi e utilizzare il wrapper al posto del flusso originale. Quando hai finito, puoi interrogare il wrapper sul suo contatore.

Altri approcci ("manuali") potrebbero utilizzare uno strumento come YSlow per raccogliere statistiche in un browser o Wireshark per esaminare il traffico sulla rete.

+0

Grazie per la risposta! Devo ammettere che non sono un ottimo programmatore e molto pigro. Non mi piace inventare la mia ruota/hack per questo. Quindi, per evitare errori e risparmiare tempo, userò il CountingInputStream di commons-io come soluzione consolidata. Grazie ancora per il tuo tempo! – er4z0r

Problemi correlati