Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.03.12;
Скачать: CL | DM;

Вниз

Еще раз про работу с https в INDY   Найти похожие ветки 

 
SergP.   (2005-09-26 14:45) [0]

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

Вобщем:

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

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

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

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


 
Seeker ©   (2005-09-27 12:15) [1]


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

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


 
S@shka ©   (2005-09-27 14:44) [2]

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


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


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


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


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


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

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


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


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


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

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

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


 
Seeker ©   (2005-09-28 09:36) [6]


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


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 10:12) [7]


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


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

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


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

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

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


 
Seeker ©   (2005-09-29 09:53) [9]


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

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

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

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


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

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

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

?

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


 
seeker ©   (2005-09-29 14:53) [11]

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


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

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


 
Seeker ©   (2005-10-17 11:49) [13]


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

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


 
o2   (2005-10-21 21:38) [14]

нужна помощь ! я попробовал соединиться с 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 ?


 
isasa ©   (2005-10-21 22:08) [15]

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

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


 
SergP ©   (2005-11-26 14:30) [16]

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

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



Страницы: 1 вся ветка

Текущий архив: 2006.03.12;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.064 c
8-1128313266
ZSOmega
2005-10-03 08:21
2006.03.12
выравнивание 16 байт для SSE


1-1139157092
Ling
2006-02-05 19:31
2006.03.12
Работа со скролами


2-1140759909
novice_man
2006-02-24 08:45
2006.03.12
Полосы прокрутки на форме.


2-1140853658
Michael5
2006-02-25 10:47
2006.03.12
Как отформатировать текст в редакторе кода Дельфи?


4-1134765212
Destroyer
2005-12-16 23:33
2006.03.12
Доступ к сиситемным папкам