Получить размер ответа HTTP в Java

Я хотел бы знать, сколько данных было отправлено в ответ на определенный http-запрос. В настоящее время я делаю следующее:

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

//проверить ответ на размер содержимого int feedsize = con.getContentLength();

Проблема в том, что длина содержимого не всегда установлена. Например. когда сервер использует transfer-encoding=chunked, я возвращаю значение -1.

Мне не это нужно для отображения информации о ходе выполнения. Мне просто нужно знать размер данных, которые были отправлены мне после того, как это было сделано.

Предыстория: мне нужна эта информация, потому что я хотел бы сравнить ее с размером ответа, который был отправлен с использованием кодировки gzip.


person er4z0r    schedule 04.11.2009    source источник


Ответы (2)


Я бы использовал commons-io CountingInputStream, который сделает эту работу за вас. Полный, но тривиальный пример:

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);
  }
}
person Jim Downing    schedule 04.11.2009
comment
Спасибо, это именно то, что мне было нужно. А с maven еще одна зависимость не помешает ;-) - person er4z0r; 04.11.2009

Вы можете расширить FilterInputStream, переопределив методы read(), read(byte[],int,int) и skip, чтобы после вызова формы super они обновляли счетчик количеством прочитанных байтов.

Затем оберните входной поток, возвращаемый URLConnection, одним из них и используйте оболочку вместо исходного потока. Когда вы закончите, вы можете запросить счетчик оболочки.

Другие («ручные») подходы включают использование таких инструментов, как YSlow, для сбора статистики в браузере или Wireshark для изучения трафика в сети.

person erickson    schedule 04.11.2009
comment
Спасибо за ваш ответ! Я должен признать, что я не очень хороший, а также очень ленивый кодер. Я не люблю изобретать собственное колесо/хак для этого. Поэтому, чтобы избежать ошибок и сэкономить время, я буду использовать CountingInputStream из commons-io в качестве устоявшегося решения. Еще раз спасибо за ваше время! - person er4z0r; 04.11.2009