WinINet: как правильно скачать файл по протоколу HTTP
От: Виноградов С.В. Россия consp11.github.io блог
Дата: 30.07.06 13:20
Оценка: 46 (5)
Статья:
WinINet: как правильно скачать файл по протоколу HTTP
Автор(ы): Виноградов С.В. (FDSC)
Дата: 26.09.2006
Статья призвана исправить небольшие упущения, допущенные в уже существующих на RSDN статьях, и облегчить начальное изучение WinInet и во многом дублирует уже существующие.


Авторы:
Виноградов С.В.

Аннотация:
Данная статья призвана исправить небольшие упущения, допущенные в уже существующих на RSDN статьях, и облегчить начальное изучение WInINet и во многом дублирует уже существующие. Код в данной статье приведён на Delphi.
Re: WinINet: как правильно скачать файл по протоколу HTTP
От: _Ramzes_ Россия  
Дата: 29.09.06 09:03
Оценка:
Здравствуйте, Виноградов С.В., Вы писали:

ВСВ>Статья:

ВСВ>WinINet: как правильно скачать файл по протоколу HTTP
Автор(ы): Виноградов С.В. (FDSC)
Дата: 26.09.2006
Статья призвана исправить небольшие упущения, допущенные в уже существующих на RSDN статьях, и облегчить начальное изучение WinInet и во многом дублирует уже существующие.


Скорее как быстро скачать файл по протоколу HTTP. Разобраны только основные моменты. Ничего нет про докачку файла...
Эх, кто бы про асинхронные операции в WinInet написал статью... Но как бы там ни было на твердую четверку тянет.
Re[2]: WinINet: как правильно скачать файл по протоколу HTTP
От: Michael Chelnokov Украина  
Дата: 29.09.06 13:38
Оценка:
Здравствуйте, _Ramzes_, Вы писали:

_R_>Эх, кто бы про асинхронные операции в WinInet написал статью...


Тогда уж лучше в WinHTTP
Re[2]: WinINet: как правильно скачать файл по протоколу HTTP
От: algol Россия about:blank
Дата: 29.09.06 14:45
Оценка: +2
Здравствуйте, _Ramzes_, Вы писали:

_R_>Скорее как быстро скачать файл по протоколу HTTP. Разобраны только основные моменты. Ничего нет про докачку файла...


Действительно, статейка только для начального изучения WinInet. Неужели RSDN только новички читают? Тогда имело бы смысл изложить статью так:

Есть такая классная функция — URLDownloadToFile().


Новичкам можно было бы еще рассказать, что такие параметры, как сервер, порт и т.д., можно получить из URL с помощью функции InternetCrackUrl(), можно было бы еще не запутывать новичков непонятной функцией CloseURL, а написать вместо нее InternetCloseHandle(). Еще можно было бы объяснить, как скачивать файл по https, как делать запросы GET и POST, как передавать параметры в POST, как добавить свои заголовки в запрос, как самому обрабатывать cookies и редиректы, как загрузить файл на сервер и показать при этом прогресс загрузки. (Ладно, насчет последнего я пожалуй загнул.)
Re[2]: WinINet: как правильно скачать файл по протоколу HTTP
От: FDSC Россия consp11.github.io блог
Дата: 29.09.06 17:28
Оценка:
Здравствуйте, _Ramzes_, Вы писали:

_R_>Здравствуйте, Виноградов С.В., Вы писали:


ВСВ>>Статья:

ВСВ>>WinINet: как правильно скачать файл по протоколу HTTP
Автор(ы): Виноградов С.В. (FDSC)
Дата: 26.09.2006
Статья призвана исправить небольшие упущения, допущенные в уже существующих на RSDN статьях, и облегчить начальное изучение WinInet и во многом дублирует уже существующие.


_R_>Скорее как быстро скачать файл по протоколу HTTP. Разобраны только основные моменты. Ничего нет про докачку файла...

_R_>Эх, кто бы про асинхронные операции в WinInet написал статью... Но как бы там ни было на твердую четверку тянет.

Ну, на 4 не тянет. Я просто исправил кое-что: а так всё уже есть в других статьях, там только неправильно записан цикл закачки.
Сам думал про асинхронные операции, да вот времени не хватило.
Re: WinINet: как правильно скачать файл по протоколу HTTP
От: Аноним  
Дата: 02.10.06 06:44
Оценка:
Список типов теперь находится в другом месте:

http://www.iana.org/assignments/media-types/
Re[2]: WinINet: как правильно скачать файл по протоколу HTTP
От: FDSC Россия consp11.github.io блог
Дата: 04.10.06 09:36
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Список типов теперь находится в другом месте:


А>http://www.iana.org/assignments/media-types/


Когда я писал статью, ссылка из статьи ещё работала. Спасибо за замечание.
Re[3]: WinINet: как правильно скачать файл по протоколу HTTP
От: _GIZMO  
Дата: 05.10.06 08:10
Оценка:
Здравствуйте, algol, Вы писали:

A>Новичкам можно было бы еще рассказать, что такие параметры, как сервер, порт и т.д., можно получить из URL с помощью функции InternetCrackUrl(), можно было бы еще не запутывать новичков непонятной функцией CloseURL, а написать вместо нее InternetCloseHandle(). Еще можно было бы объяснить, как скачивать файл по https, как делать запросы GET и POST, как передавать параметры в POST, как добавить свои заголовки в запрос, как самому обрабатывать cookies и редиректы, как загрузить файл на сервер и показать при этом прогресс загрузки. (Ладно, насчет последнего я пожалуй загнул.)


Так возьмись и напиши (на 5+ . Как новичек разобрасля почти во всем кроме — "как самому обрабатывать cookies и редиректы".
Или будь добр объясни мне вкратце куки WinInet сама берет из кэша IE? И с редиректами не понял никак не удается получить 302 Moved Temporarily от сервера, чего надо в (и когда) в Referer пихать.
_GIZMO
Re[4]: WinINet: как правильно скачать файл по протоколу HTTP
От: algol Россия about:blank
Дата: 05.10.06 11:02
Оценка: 2 (1)
Здравствуйте, _GIZMO, Вы писали:

_GI>Так возьмись и напиши (на 5+ . Как новичек разобрасля почти во всем кроме — "как самому обрабатывать cookies и редиректы".


Так на это время нужно.

_GI>Или будь добр объясни мне вкратце куки WinInet сама берет из кэша IE? И с редиректами не понял никак не удается получить 302 Moved Temporarily от сервера, чего надо в (и когда) в Referer пихать.


Если вкратце, то WinInet сам обрабатывает куки и редиректы, если не установлены флаги INTERNET_FLAG_NO_COOKIES и INTERNET_FLAG_NO_AUTO_REDIRECT в HttpOpenRequest. Но иногда приходится их обрабатывать самостоятельно, например если заходишь на сайт под другим логином и не хочешь оставлять за собой куки. Из responce их можно получить через HttpQueryInfo(hRequest, HTTP_QUERY_SET_COOKIE,..), распарсить и где-нибудь в программе сохранить. EXPIRED куки нужно удалять. По хорошему их нужно хранить где-нибудь в map, но обычной строки для этого вполне хватает. Чтобы добавить куки в запрос, нужно добавить HTTP header "Cookie", примерно так:

    CString header = "Cookie: " + sCookie + "\r\n";
    HttpAddRequestHeaders(hRequest, header, header.GetLength(), HTTP_ADDREQ_FLAG_ADD);


Если сам обрабатываешь куки, то возможно придется обрабатывать и редиректы. Например gmail вешает куки на редиректах. Тут нет ничего хитрого. Ставим флаг INTERNET_FLAG_NO_AUTO_REDIRECT, получаем код ответа через HttpQueryInfo(hRequest, HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER,..). Если это редирект (коды 300-399), то получаем новый URL через HttpQueryInfo(hRequest, HTTP_QUERY_LOCATION,..) и переходим на него, заменив Referer на текущий адрес.
Если флаг INTERNET_FLAG_NO_AUTO_REDIRECT не стоит, то 302 от сервера не получишь, WinInet сам его обработает.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.