Indy, IdHTTP & HTTPS

8 отговора 0 прегледа
#1

Indy, IdHTTP & HTTPS

Ползвам IdHTTP1.Get() за получаване на данни през http, но в един
случай ми се налага да ползвам HTTPS(secure)
[линк] и тогава започва да иска
Intercept. IdConnectionInterceptOpenSSL изисква .dll , което е голям проблем в моя случай. Но дори когато го добавя дава грешка при отварянето:
Socket Error # 11004

Get при нормалните сайтове си работи.

Отговор
в отговор на chovek #2

Re: Indy, IdHTTP & HTTPS

за сега нещата не тръгват. Никой ли няма опит с този проблем?

Отговор
в отговор на chovek #3

Re: Indy, IdHTTP & HTTPS

Това е Get който аз ползвам, нямам претенции да е написано оптимално и т.н :-)
Дано ти свърши работа. При мен работи.

=================================
function GetURL(url:string; myIdHTTP:TIdHTTP = nil):string;
var haveToClose : boolean;
IdSSLIOHandlerSocket: TIdSSLIOHandlerSocket;
oldHandler : TIdIOHandler;
crypted : boolean;
begin
haveToClose := not Assigned(myIdHTTP);
IdSSLIOHandlerSocket := nil;
crypted := false;
result := 'error';
if (haveToClose) then myIdHTTP:=TIdHTTP.Create(MainForm);
try
//setupIdHTTP(myIdHTTP); //Dopalnitelni nastroiki Proxy etc.
try
if pos('https:',url)>0 then
begin
crypted := true;
IdSSLIOHandlerSocket:=TIdSSLIOHandlerSocket.Create(MainForm);
IdSSLIOHandlerSocket.Name := 'IdSSLIOHandlerSocket';
IdSSLIOHandlerSocket.SSLOptions.Method := sslvSSLv2;
IdSSLIOHandlerSocket.SSLOptions.Mode := sslmUnassigned;
IdSSLIOHandlerSocket.SSLOptions.VerifyMode := [];
IdSSLIOHandlerSocket.SSLOptions.VerifyDepth := 0;
oldHandler:=myIdHTTP.IOHandler;
myIdHTTP.IOHandler := IdSSLIOHandlerSocket;
myIdHTTP.Port := 443;
myIdHTTP.HTTPOptions:=[hoForceEncodeParams];
end;
result:=myIdHTTP.Get(url);
except
end;
finally
if (crypted) then
begin
myIdHTTP.IOHandler:=oldHandler;
IdSSLIOHandlerSocket.free;
end;
if (haveToClose) then myIdHTTP.Free;
end;
end;

=====================
PPS: dir-а е малко странен днес, май изисква logout за да пуснеш съобщение...

Отговор
в отговор на mole. #4

Re: Indy, IdHTTP & HTTPS

Мерси много. Изглежда работещо, но не успявам да го подкарам.
С коя версия на Indy / Delphi работи тази процедура?
Ползва ли някакви dll или сертификационни файлове?

Аз опитах да го подкарам на Delphi 6 и Indy 8. Но нямаше съвместимост с компонентите. При опит да мигрирам към Indy10 вече не мога да компилирам
със събщение: [Fatal Error] Main.pas(9): Unit IdBaseComponent was compiled with a different version of System.RTLVersion

Същото го дава и за IdComponent, IdTCPConnection, IdTCPClient, IdHTTP т.н.

Отговор
в отговор на chovek #5

Re: Indy, IdHTTP & HTTPS

Извинявай, трябваше да посоча още в първия постинг:
gsIdVersion = '9.0.18';
Delphi 7
Изисква DLL мисля че няма как да не изисква... ssleay32.dll и libeay32.dll

С Indy10 мои спомени спомени имах проблеми, ама питай ме сега какви... не се сещтам...

Отговор
в отговор на mole. #6

Re: Indy, IdHTTP & HTTPS

мерси моле, нещата имат напредък. всичко както ми го даде работи. но при get заявка с предаване на параметър [линк]
не се кънектва и дава:"Socket Error # 11004

може би предаването на параметър прави невалиден адреса. Имаш ли идея?

Отговор
в отговор на chovek #7

Re: Indy, IdHTTP & HTTPS

Пробва ли вместо [линк]
URL да бъде [линк]/?param=1234

Отговор
в отговор на mole. #8

10x

човек, обичам те!
не можеш да си представиш колко ми помогна.
3 дена го боря, а то било една чертичка.

10x отново

Отговор
в отговор на mole. #9

Re: Indy, IdHTTP & HTTPS

Здравейте,
попаднах на тази готина функцийка, даже при мен съм я кръстил GetURLMole.

function GetURL(url:string; myIdHTTP:TIdHTTP = nil):string;
var haveToClose : boolean;
IdSSLIOHandlerSocket: TIdSSLIOHandlerSocket;
oldHandler : TIdIOHandler;
crypted : boolean;
begin
haveToClose := not Assigned(myIdHTTP);
IdSSLIOHandlerSocket := nil;
crypted := false;
result := 'error';
if (haveToClose) then myIdHTTP:=TIdHTTP.Create(MainForm);
try
//setupIdHTTP(myIdHTTP); //Dopalnitelni nastroiki Proxy etc.
try
if pos('https:',url)>0 then
begin
crypted := true;
IdSSLIOHandlerSocket:=TIdSSLIOHandlerSocket.Create(MainForm);
IdSSLIOHandlerSocket.Name := 'IdSSLIOHandlerSocket';
IdSSLIOHandlerSocket.SSLOptions.Method := sslvSSLv2;
IdSSLIOHandlerSocket.SSLOptions.Mode := sslmUnassigned;
IdSSLIOHandlerSocket.SSLOptions.VerifyMode := [];
IdSSLIOHandlerSocket.SSLOptions.VerifyDepth := 0;
oldHandler:=myIdHTTP.IOHandler;
myIdHTTP.IOHandler := IdSSLIOHandlerSocket;
myIdHTTP.Port := 443;
myIdHTTP.HTTPOptions:=[hoForceEncodeParams];
end;
result:=myIdHTTP.Get(url);
except
end;
finally
if (crypted) then
begin
myIdHTTP.IOHandler:=oldHandler;
IdSSLIOHandlerSocket.free;
end;
if (haveToClose) then myIdHTTP.Free;
end;
end;

Проблема е следния: използвам indy10 и ми дава грешка: Read timeout
Целта ми е да направя заявка със SSL.
Ако не използвам SSL компонент, всичко си е наред.

В indy10 няма такова нещо: myIdHTTP.Port - незнам дали проблема е от това или от нещо друго, но ще съм ви много благодарен да помогнете.

Отговор