Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2006.03.12;
Скачать: [xml.tar.bz2];

Вниз

Еще раз про работу с 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.014 c
15-1139950401
AlterEgo of WondeRu
2006-02-14 23:53
2006.03.12
А в вашем регионе GPRS от Beeline работает?


4-1134982464
Chaser
2005-12-19 11:54
2006.03.12
При закрытии программы - минимизация в трей


2-1140448453
Spieler
2006-02-20 18:14
2006.03.12
Сообщения Windows


6-1132861630
Николай2005
2005-11-24 22:47
2006.03.12
Ошибка 411 при отправке запроса через TIdHTTP методом POST


15-1140068793
Ega23
2006-02-16 08:46
2006.03.12
С Днём рождения! 16 февраля





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский