2009-11-04 16 views
5

Chciałbym wiedzieć, ile danych zostało wysłanych w odpowiedzi na określone żądanie http. Co ja obecnie zrobić to w ten sposób:Uzyskaj rozmiar odpowiedzi HTTP w Javie

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

// sprawdza odpowiedź za treść wielkości int feedsize = con.getContentLength();

Problem polega na tym, że content-legnth nie zawsze jest ustawiony. Na przykład. kiedy serwer używa transferu-encoding = chunked, otrzymuję wartość -1.

Potrzebuję nie potrzebuję tego do wyświetlenia informacji o postępie. Po prostu muszę znać rozmiar danych, które zostały mi przesłane po zakończeniu.

Tło: Potrzebuję tych informacji, ponieważ chcę porównać je z rozmiarem odpowiedzi wysłanej za pomocą kodowania gzip.

Odpowiedz

8

Użyłbym commons-io CountingInputStream, który wykonałby dla ciebie zadanie. Pełny, ale trywialny przykład:

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

Dzięki temu jest dokładnie to, czego potrzebowałem. I z mavenem jeszcze jedna zależność nie zaszkodzi ;-) – er4z0r

2

można rozszerzyć FilterInputStream, przesłanianie read(), read(byte[],int,int) i skip metod tak, że po wywołaniu formularz super, zaktualizuj one licznik z liczbą bajtów czytanych.

Następnie zawiń strumień wejściowy zwrócony przez URLConnection z jednym z nich i użyj opakowania zamiast oryginalnego strumienia. Kiedy skończysz, możesz sprawdzić, czy opakowanie jest jego licznikiem.

Inne podejścia ("ręczne") to narzędzie takie jak YSlow do gromadzenia statystyk w przeglądarce lub Wireshark do badania ruchu w sieci.

+0

Dzięki za odpowiedź! Muszę przyznać, że nie jestem zbyt dobrym, a także bardzo leniwym programistą. Nie lubię wymyślać dla tego własnego koła/hackera. Aby uniknąć błędów i zaoszczędzić czas, użyję CountingInputStream z commons-io jako ustalonego rozwiązania. Jeszcze raz dziękuję za poświęcony czas! – er4z0r