Вопрос

Я хотел бы знать, сколько данных было отправлено в ответ на определенный http-запрос.То, что я сейчас делаю, это:

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

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

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top