Я использую IBindStatusCallback и URLOpenPullStream для загрузки данных асинхронно. Я хотел бы выделить буфер данных до поступления данных.
Есть ли способ получить размер потока или прочитать заголовок Stream, чтобы я мог выделить буфер с соответствующим размером?
Если вам повезет, IBindStatusCallback::OnProgress
, ulProgressMax
будет отличным от нуля и будет фактически правильно представлять размер данных.
Однако во многих (возможно, большинстве) случаях вы не можете узнать общий размер, пока не загрузите весь ответ. Для этого есть две причины:
Сервер не сообщает заголовок Content-Length:
но вместо этого использует закодированную кодировку. Просто нет информации о том, насколько велика будет реакция.
Сервер сообщает заголовок Content-Length:
но также использует сжатие gzip
или подобное. Content-Length:
сообщает размер сжатых данных и то, что вы получите в ulProgressMax
. Но UrlMon автоматически распаковывает и отправляет вам фактические данные для декомпрессии, поэтому ulProgressMax
будет слишком низким. Здесь снова нет информации о возможном размере (несжатого) ответа до тех пор, пока все это не прибудет.
ulProgressMax
и будьте готовы выделять больше по мере необходимости. Нет причин для реализации двух разных стратегий.