Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Еще раз про работу с https в INDY [D6, WinME, Win2k, WinXP]


SergP. ©   (2005-09-26 14:45:00) 

Создал новую ветку, так как в старой сначала был немного другой вопрос....

Вобщем:

Нужно скачать некую инфу по https.
Проблема в том что при использовании INDY выскакивает сообщение о том что не загружена какая-то SSL library.

Но помню когда-то я делал такое на д5 (Инди скачивал и устанавливал отдельно) и все работало, никто не требовал никакой библиотеки...

В данном случае у меня Д6 с ИНДИ которая шла в комплекте с Д6.

Из-за чело это так?
Как выйти из положения?


SergP   (2005-11-26 14:30:00) [1]

И еще один вопрос есть:
Хочу отобразить процесс закачивания данных.
Для этого нужно получить размер контента до того как будет приниматься этот контент. Т.е. мне нужен либо размер контента, либо что-нить откуда можно будет выдрать нужную информацию (например весь заголовок ответа сервера).

Как можно получить размер контента?
Использую для закачки код, основаный на [6].


isasa   (2005-10-21 22:08:00) [2]

Так, устраняется правкой реестра...То что выше заданого в реестре параметра будет ожидать своей очереди.
Точно так

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings]
"MaxConnectionsPerServer"=dword:00000020
"MaxConnectionsPer1_0Server"=dword:00000020


o2   (2005-10-21 21:38:00) [3]

нужна помощь ! я попробовал соединиться с https://www.chel.mts.ru/sms/cgi-bin/cgi_.exe?function=sms_send , но у меня функция HttpSendRequest выдала false. Ошибка 12045 The function is unfamiliar with the Certificate Authority that generated the server's certificate... У них там какой то сертификат глючный. Как сделать, чтобы функция забила на то что сертификат unfamiliar ?


Seeker   (2005-10-17 11:49:00) [4]


> А вот как с куками оно работает?
> Пробовал скачивать страничку с сервера, который меня авторизует
> по кукам - все работает. Куки передаются как положено.
> Но для чего переменная cookies нужна - понять не могу...
>

Это кусок моего кода(подчищенный).Мой полный код сам обрабатывает куки без сохренения те работает с флагом NOCOOKIES если выставить этот флаг, то через cookies можно передавать нужные тебекукисы.


SergP.   (2005-10-15 13:32:00) [5]

А вот как с куками оно работает?
Пробовал скачивать страничку с сервера, который меня авторизует по кукам - все работает. Куки передаются как положено.
Но для чего переменная cookies нужна - понять не могу...


seeker   (2005-09-29 14:53:00) [6]

Да, когда удалял лишнее прибил случайно, но можно было догадаться что Fdata и Data Одно и тоже.


SergP.   (2005-09-29 13:35:00) [7]

И еще... Я не совсем понял как отправлять POST-запросы...
Например сервер поддерживает как GET так и POST
но GET наверное не подойдет в случае если URL слишком длинный получается. (просто в некоторых случаях приходится очень много параметров передается).
Каким образом я должен передавать POST-данные в

function OpenURL(Metod, URL:string; Data:string=''; Header:string=''): string;

?

А то что-то не вижу... Например Data - нигде не используется


Seeker   (2005-09-29 09:53:00) [8]


> 1. можно ли запускать [6] в отдельном потоке?

Да
> 2. Можно ли изменять текущие параметры прокси для [6] с
> помощью UrlMkSetSessionOption ?

Можно их напрямую указать в InternetOpen
InternetOpen('Delphi',INTERNET_OPEN_TYPE_PROXY, PChar(Proxy),nil,1);
</
> 3. Где-то читал про ограничения при использовании WinInet
> на количество соединений. Так ли это? Что будет если я попытаюсь
> создать больше?

Так, устраняется правкой реестра...То что выше заданого в реестре параметра будет ожидать своей очереди.
CODE>


SergP.   (2005-09-28 15:44:00) [9]

И еще парочка вопросов:
1. можно ли запускать [6] в отдельном потоке?
2. Можно ли изменять текущие параметры прокси для [6] с помощью UrlMkSetSessionOption ?

3. Где-то читал про ограничения при использовании WinInet на количество соединений. Так ли это? Что будет если я попытаюсь создать больше?


SergP.   (2005-09-28 10:12:00) [10]


> Seeker ©   (28.09.05 09:36) [6]


Я сначала пробовал сам писать, но видно что-то не то делал так как у меня HttpSendRequest постоянно возвращал false.

А твой пример работает. только что проверял. Большое спасибо...
Щас буду с ним разбираться...


Seeker   (2005-09-28 09:36:00) [11]


> Если не трудно примерчик не приведете?


Uses ...WinInet, ...
...
function OpenURL(Metod, URL:string; Data:string=''; Header:string=''): string;
var
 FSession, FConnect, FRequest: HINTERNET;
 FMetod,FURL,FData,Cookies:string;
 BytesRead,BuffSize:cardinal;
 Buff:String;
 dwFlag:Cardinal;
 gotIt: boolean;
 URLC:TURLComponents;
 tout:Integer;
 HostName,UrlPath:array[1..INTERNET_MAX_PATH_LENGTH] of char;
 ExtraInfo:array[1..$ffff] of char;
begin
if trim(Metod) = '' then FMetod:='GET' else FMetod:=Trim(UpperCase(Metod));
Result:='';
if pos('://',URL)= 0 then
 FURL:='http://'
else FURL:='';
FURL:=FURL+URL;
FillChar(URLC,SizeOf(TURLComponents),0);
with URLC do
begin
 dwStructSize := sizeOf(TURLComponents);
 lpSzExtraInfo := @ExtraInfo[1];
 dwExtraInfoLength := INTERNET_MAX_PATH_LENGTH;
 lpSzHostName := @HostName[1];
 dwHostNameLength := INTERNET_MAX_PATH_LENGTH;
 lpszUrlPath := @UrlPath[1];
 dwUrlPathLength := INTERNET_MAX_PATH_LENGTH;
end;
InternetCrackUrl(PChar(FURL),0,ICU_ESCAPE, URLC);
FSession := InternetOpen('Delphi', INTERNET_OPEN_TYPE_PRECONFIG , nil, nil, 0);
if Assigned(FSession) then
 begin
   try
     tout:=10*1000;
     InternetSetOption(FSession, INTERNET_OPTION_RECEIVE_TIMEOUT,@tout,SizeOf(tout));
     FConnect := InternetConnect(FSession,
                                 URLC.lpszHostName,
                                 URLC.nPort,
                                 nil,
                                 nil,
                                 INTERNET_SERVICE_HTTP,
                                 0,
                                 0);
     if Assigned(FConnect) then
       begin
         try
           if URLC.nPort = 443 then
             dwFlag := INTERNET_FLAG_SECURE
                       or INTERNET_FLAG_IGNORE_CERT_CN_INVALID
                       or INTERNET_FLAG_IGNORE_CERT_DATE_INVALID
           else
             dwFlag := 0;
           dwFlag := dwFlag or INTERNET_FLAG_RELOAD;
           StrCat(URLC.lpSzUrlPath, URLC.lpszExtraInfo);
           URLC.lpSzExtraInfo := #0;
           URLC.dwExtraInfoLength := 0;
           if FMetod = 'GET' then
             begin
               if FData '' then
                 begin
                   if pos('?', URLC.lpszUrlPath) = 0 then
                     FData:='?'+FData
                   else
                     FData:='&'+FData ;
                 StrCat(URLC.lpszUrlPath,PAnsiChar(FData));
                 FData:='';
                end;
              end;
           URLC.dwUrlPathLength:=length(URLC.lpszUrlPath);
           FRequest := HttpOpenRequest(FConnect, PChar(FMetod), URLC.lpszUrlPath, 'HTTP/1.0',
                                       nil,
                                       nil,
                                       dwFlag,
                                       0);
           if Assigned(FRequest) then
             begin
               if pos('?', URLC.lpSzExtraInfo) = 1 then
                 begin
                   inc(URLC.lpSzExtraInfo);
                   dec(URLC.dwExtraInfoLength);
                 end;
               if FData '' then
                 begin
                    URLC.lpszExtraInfo:=PAnsiChar(FData);
                    FData:='';
                 end;
             URLC.dwExtraInfoLength := length(URLC.lpSzExtraInfo);
             if FMetod='POST' then
               Header:='Content-Type: application/x-www-form-urlencoded';
             if Cookies '' then
               begin
                 if pos('Cookies: ',Cookies) = 0 then
                 if Header '' then
                     Header:=Header+ #13#10+'Cookie: '+Cookies
                 else
                     Header:='Cookie: '+Cookies ;
               end;
               try
                 if HttpSendRequest(FRequest,PChar(Header), Length(Header), URLC.lpszExtraInfo, URLC.dwExtraInfoLength) then
                   begin
                     //Read file
                     BuffSize:=1024;
                     repeat
                     BytesRead:=0;
                     SetLength(buff,BuffSize);
                     gotIt := InternetReadFile(FRequest, @Buff[1], BuffSize, bytesRead);
                     Setlength(Buff,BytesRead);
                     Result:=Result+Buff;
                    until (gotIt and (bytesRead = 0));
                   end
                 else
                   begin
                   // не могу отослать запрос
                   end;
               finally
                 InternetCloseHandle(FRequest);
               end;
             end
           else
             begin

             end;
         finally
           InternetCloseHandle(FConnect);
         end;
       end
     else
       begin

       end;
   finally
     InternetCloseHandle(FSession);
   end;
 end
else
 begin

 end;
end;


SergP.   (2005-09-28 09:30:00) [12]


> S@ska   (27.09.05 22:32) [4]


Во первых прочитай сабжевый пост, во вторых на днях убрал бывшую Инди и поставил Инди 10, так вот даже там такой штуки как IdOpenSSlCleint нет....

Есть TIdSSLIOHandlerSocketOpenSSL, но читай сабжевый пост.

И в третьих цитируемые тобой предложения касались Wininet а не Инди


S@ska   (2005-09-27 22:32:00) [13]


> Если не трудно примерчик не приведете?
> Требуется всего-лишь скачать инфу по урлу https://.....
> и поместить ее в переменную типа string

Берешь IdHTTP и цепляешь к нему IdOpenSSlCleint собственно все работаешь также как с просто IdHTTP


SergP.   (2005-09-27 18:25:00) [14]


> Seeker ©   (27.09.05 12:15) [1]
>
> > Как выйти из положения?
>
> А без инди обойтись не судьба?
> Есть такая штука как WinInet.


Если не трудно примерчик не приведете?
Требуется всего-лишь скачать инфу по урлу https://.....
и поместить ее в переменную типа string


S@shka   (2005-09-27 14:44:00) [15]

Дык естественно надо скачать SLL библиотеку ))) О чем и говорится.
Для особо любознательных ....
http://www.indyproject.org/Sockets/SSL.iwp


Seeker   (2005-09-27 12:15:00) [16]


> Как выйти из положения?

А без инди обойтись не судьба?
Есть такая штука как WinInet.


Наверх

Титульная страница Поиск, карта сайта Написать письмо