Entwickler-Ecke

Internet / Netzwerk - IOHandler value is not valid (IdHTTP)


Daniel L. - Sa 23.09.17 22:18
Titel: IOHandler value is not valid (IdHTTP)
Hallo NG!

In meiner Anwendung nutze ich einen Service von Yahoo,
um Aktienkurse mit IdHTTP (Indy 10) downzuloaden.

Über viele Monate lief die Anwendung fehlerlos,
bis auf einmal eine Exception auftrat, - obwohl ich überhaupt nichts verändert hatte :o

Als Beispiel hier der Abruf einer Autoaktie.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm1.Button1Click(Sender: TObject);
var
  http: TIdHTTP;
  ms: TMemoryStream;
  UrlStr : string;
begin
  UrlStr := 'http://finance.yahoo.com/d/quotes.csv?s=BMW.DE&f=l1';
  http := TIdHTTP.Create (nil);
  http.HandleRedirects := true;
  ms := TMemoryStream.Create;
  http.Get (UrlStr, ms);  --> Exception der Klasse EIdIOHandlerPropInvalid mit Meldung 'IOHandler value is not valid'
end;


Die Position in unit IdHTTP (IdHTTP.pas), wo der Fehler ausgelöst wird, ist:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
...
function TIdCustomHTTP.SetHostAndPort: TIdHTTPConnectionType;
   ...
   if TextIsSame(URL.Protocol, 'HTTPS'then begin  {do not localize}
      // Just check can we do SSL
      if (not Assigned(IOHandler)) or (not (IOHandler is TIdSSLIOHandlerSocketBase)) then begin
        raise EIdIOHandlerPropInvalid.Create(RSIOHandlerPropInvalid);
      end;
   ...  
...



Leider fehlen mir die Neztwerkkentnisse, um weiterzukommen -
wäre toll, wenn jemand helfen könnte.

Gibt man übrigens den UrlString direkt in einen Browser ein,
lässt sich der Kurs ohne Probleme als csv-File downloaden.

Nutze TD Prof mit Indy 10

Daniel L.


Holgerx - So 24.09.17 06:24

Hmm..

Könnte es sein, das Yahoo von HTTP auf HTTPS umgestellt hat?

Durch das

http.HandleRedirects := true;

wird hier durch Indy das Redirect durchgeführt.

Jedoch wird dann bei INDY für das HTTPS ein entsprechender SSL-Handler benötigt, incl. der zwei DLLs.
Da beides anscheined nicht vorhanden, gibt es die Exception.

Ein Browser hat die benötigten Komponenten bereits intrigiert und mach auch das Redirect/Umstellen auf HTTPS automatisch, so dass dort dementsprechend keine Fehlermeldung kommt.

Such mal mit 'INDY10 SSL', da gelangst du dann z.B. hierhin
http://www.delphipraxis.net/165931-could-not-load-ssl-library-%5Bindy10-5-5%5D.html


Delete - Mo 25.09.17 04:23

- Nachträglich durch die Entwickler-Ecke gelöscht -


t.roller - Mo 25.09.17 07:52

user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
Es wurde im Code nirgends ein entsprechender IOHandler dem TIdHTTP zugewiesen, daher auch die Fehlermeldung. So sollte es gehen...


Wenn die EXE Zugriff hat auf
(uses
IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP,
IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack, IdSSL, IdSSLOpenSSL;)
und libeay32.dll und ssleay32.dll,
dann geht es.


Daniel L. - Mo 25.09.17 09:44

Danke an alle!

Nach Holgerxs Hinweis hatte ich schnell rausgefunden, dass ich IdSSLIOHandlerSocketOpenSSL
und die beiden ssl - dll's brauche, allerdings konnte ich auch nach langer Suche keine
finden, die Versionsmäßig zu D 2006 passen (Indy 10.1.5)
Jetzt habe ichs mal mit Delphi 10.1 Starter probiert und es geht.
(Hatte ich ganz vergessen, weil ich es nach Erprobung nie genutzt hatte) :wink:
Werd mal ein höheres Indy in 2006 reininstallieren - falls das geht.

Gruß Daniel


Delete - Mo 25.09.17 12:13

- Nachträglich durch die Entwickler-Ecke gelöscht -


Daniel L. - Mo 25.09.17 15:56

Also bei mir gehts nur mit IOHandler und DLL's

Daniel


baka0815 - Fr 06.10.17 12:16

Für den Indy OpenSSL IOHandler braucht man auch die DLLs.
Die gibt's z.B. unter https://indy.fulgan.com/SSL/?C=N;O=D.