![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
WinInet. Узнать размер контента, принимаемого по http/https [D6, Win95/98, WinME, Win2k, WinXP]
SergP. © (2005-11-28 10:32:00)Нужно узнать размер контента, до закачки самого контента, для отображения процесса закачки.
Как можно это сделать...
Использую код, основаный на
http://delphimaster.ru/cgi-bin/forum.pl?id=1127731558&n=4
SergP (2005-11-29 23:06:00) [1]
> А если разрыв произошел не по инициативе сервера... Сеть
> пропала и тп.
Х/З... Но вроде бы есть разница что сеть попала, что сервер корректно закрыл соединение...
Кстати например форум phpBB выдает контент странички без выдачи Content-Length
seeker (2005-11-29 14:51:00) [2]
> Если не указан Content-Length то вроде бы об окончании
> загрузки узнается по тому когда сервер закрывает соединение.
> ..
А если разрыв произошел не по инициативе сервера... Сеть пропала и тп.
SergP. (2005-11-29 13:27:00) [3]
> По идее, после отправки запроса, сервер должен сначала сформировать
> страницу а потом заголовок в который вставить Content-Length
> сформированной страницы.А иначе как узнать полностью закачалась
> страница или нет.
Если не указан Content-Length то вроде бы об окончании загрузки узнается по тому когда сервер закрывает соединение...
> isasa © (29.11.05 13:00) [8]
Имелось ввиду на русском языке... Ну да ладно... Попробую сам что-нить поискать...
isasa (2005-11-29 13:00:00) [4]SergP © (28.11.05 22:02) [6]
Вопрос еще есть: где можно найти нормальную справку по функциям WININET? А то чувствую, что вопросы по параметрам этой функции появятся.
MSDN на CD(DVD) или
http://search.microsoft.com/search/results.aspx?st=b&na=80&qu=InternetQueryDataAvailable&View=msdn
http://search.microsoft.com/search/results.aspx?view=msdn&st=b&na=82&qu=HttpQueryInfo
seeker (2005-11-29 12:51:00) [5]
> Почему? Если страничка динамическая (php, perl и т.п.),
> то очень часто Content-Length отсутствует, так как его просто
> невозможно посчитать наперед.
По идее, после отправки запроса, сервер должен сначала сформировать страницу а потом заголовок в который вставить Content-Length сформированной страницы.А иначе как узнать полностью закачалась страница или нет.
SergP (2005-11-28 22:02:00) [6]
> (хотя я ни разу не видел чтоб его небыло).
Почему? Если страничка динамическая (php, perl и т.п.), то очень часто Content-Length отсутствует, так как его просто невозможно посчитать наперед. Единственное - это складировать куски контента в буфер а уже в конце посчитать размер, выдать заголовки, а потом и сам контент. Но так далеко не все делают....
> HttpQueryInfo(FRequest, HTTP_QUERY_CONTENT_LENGTH or HTTP_QUERY_FLAG_NUMBER,
> @ContentSize, dwBufLen, dwIndex )
Спасибо.
Вопрос еще есть: где можно найти нормальную справку по функциям WININET? А то чувствую, что вопросы по параметрам этой функции появятся.
seeker (2005-11-28 19:41:00) [7]Нет разницы HTTP или HTTPS.Если Content-Length есть значит он есть(хотя я ни разу не видел чтоб его небыло).
Сразу после HttpSendRequest можно читать заголовки...
HttpQueryInfo(FRequest, HTTP_QUERY_CONTENT_LENGTH or HTTP_QUERY_FLAG_NUMBER, @ContentSize, dwBufLen, dwIndex )
SergP. (2005-11-28 17:14:00) [8]
> atruhin © (28.11.05 14:56) [3]
> В общем случае никак. Чаще всего для страниц сервер передает
> Content-Length, но это небязательно. Для рисунков вроде
> передает всегда. Еще есть потоковое кодирование, там не
> узнаешь. Это для HHTP, с HTTPS не работал
Ну понятно что узнать можно только если сервер передает Content-Length, именно этот случай меня и интересует. Но также интересует случай с https. Просто я не знаю его особенности, и можно ли там узнать размер контента, и может ли сервер его передавать в случае https?
> isasa © (28.11.05 11:02) [1]
Спасибо. Попробую...
atruhin (2005-11-28 14:56:00) [9]В общем случае никак. Чаще всего для страниц сервер передает Content-Length, но это небязательно. Для рисунков вроде передает всегда. Еще есть потоковое кодирование, там не узнаешь. Это для HHTP, с HTTPS не работал
Anatoly Podgoretsky (2005-11-28 11:22:00) [10]К тому же не обязательный, поэтому и функция называется InternetQueryData Available
isasa (2005-11-28 11:02:00) [11]Попробуй так
HttpSendRequest(hHTTP, nil, 0, nil, 0);
...
if InternetQueryDataAvailable(hHTTP, BytesAvail, 0, 0) then ...
хотя это, кажется только HTML-код, приходящей страницы. Рисунки ..., естественно, отдельно :)