Entwickler-Ecke
Internet / Netzwerk - Zugriff auf https
Gagga - Sa 15.04.23 12:25
Titel: Zugriff auf https
Hallo!
Aus meinen Programmen wird auf Dateien auf meinem Server-Platz zugegriffen. Mal wird nur geprüft, ob eine Datei vorhanden ist, mal wird eine Datei auf den Server geschrieben, mal wird eine Datei heruntergeladen. Jetzt bin ich auf https gewechselt und ich ich bekomme die neuen, notwendigen Routinen nicht hin.
Das Herunterladen klappt bei einigen Anwendern mit:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27:
| Function herunterladen(quelle,ziel:string):boolean; var URI : TIdURI; IOHandler : TIdSSLIOHandlerSocketOpenSSL; HTTP : TIdHTTP; FileStream: TFileStream; begin
URI := TIdURI.Create(quelle);
HTTP := TIdHTTP.Create(nil); if URI.Protocol = 'https' then begin IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil); HTTP.IOHandler := IOHandler; end; FileStream:= TFileStream.Create(Ziel, fmCreate); try HTTP.Get(URI.GetFullURI([ofAuthInfo]), FileStream); finally
end;
FileStream.Free; result := true; end; |
Bei einigen Anwendern kommt die Fehlermeldung "Could not load SSL library". Mit Bibliotheken habe ich noch keine Programmiererfahrung. Es reicht wohl nicht, die libeay32.dll und die ssleay32.dll in den Programmpfad zu packen. Was muss ich tun?
Zudem scheitert
TFileStream.Create(Ziel, fmCreate), wenn die Quelle nicht existiert, was mir unverständlich ist.
Wie prüfe ich, ob eine Datei auf einem https-Server existiert? Die Funktion
HTTPFileExists funzt nicht. Die Prüfung benötige ich auch in einem anderen Kontext.
Soweit erstmal.
Beste Grüße
Rued
Moderiert von Th69: Delphi-Tags hinzugefügt
Moderiert von Narses: Code- durch Delphi-Tags ersetzt
jaenicke - So 16.04.23 01:59
Gagga hat folgendes geschrieben : |
Bei einigen Anwendern kommt die Fehlermeldung "Could not load SSL library". Mit Bibliotheken habe ich noch keine Programmiererfahrung. Es reicht wohl nicht, die libeay32.dll und die ssleay32.dll in den Programmpfad zu packen. Was muss ich tun? |
Doch, das reicht vollkommen aus. Die Zugriffsrechte müssen natürlich vorhanden sein (insbesondere um die DLLs nachträglich auszuliefern z.B.).
Gagga hat folgendes geschrieben : |
Zudem scheitert TFileStream.Create(Ziel, fmCreate), wenn die Quelle nicht existiert, was mir unverständlich ist. |
Welcher Fehler kommt denn? Fehlen vielleicht die Rechte am Ziel?
Gagga hat folgendes geschrieben : |
Wie prüfe ich, ob eine Datei auf einem https-Server existiert? |
Http.Get löst eine Exception aus (Fehler 404), wenn sie nicht existiert. Du kannst mit Head statt Get auch nur anfragen.
Gagga - So 16.04.23 10:51
Zu den Dlls:
Die DLLs werden mit der Installation in das Programmverzeichnis kopiert.
Zu
TFileStream.Create(Ziel, fmCreate):
Das Ziel ist das Anwenderverzeichnis. Fehlermeldung sagt, dass der Pfad nicht gefunden werden kann. Der Pfad ist jedoch korrekt und TFileStream.Create mit demselben Ziel funktioniert bei isoliertem Test.
Zu
HTTPFileExists:
Das ist die Funktion, die bei einer Prüfung auf einem https-Server den Fehler "IOHandler value is not valid" auslöst:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| function HTTPFileExists(aURL: String): Boolean; begin with TIdHTTP.Create(nil) do try try ReadTimeout := 5000; Head(aURL); Result := ResponseCode = 200; except Result := False; end; finally Free; end; end; |
Moderiert von Th69: Vollzitat entfernt.
Moderiert von Th69: Delphi-Tags hinzugefügt
jaenicke - So 16.04.23 11:03
Gagga hat folgendes geschrieben : |
Zu den Dlls:
Die DLLs werden mit der Installation in das Programmverzeichnis kopiert.
Zu TFileStream.Create(Ziel, fmCreate):
Das Ziel ist das Anwenderverzeichnis. Fehlermeldung sagt, dass der Pfad nicht gefunden werden kann. Der Pfad ist jedoch korrekt und TFileStream.Create mit demselben Ziel funktioniert bei isoliertem Test. |
Hast du wirklich vorher das Ziel genau verglichen?
Dann wirst du in beiden Fällen nur mit dem
Process Monitor [
https://learn.microsoft.com/en-us/sysinternals/downloads/procmon] herausfinden können, was passiert. Du setzt den Filter auf Process Name is DeineExe.exe und Path auf "ends with" und dem jeweiligen Dateinamen (die DLL, der Dateiname in Ziel, ...).
Gagga hat folgendes geschrieben : |
Zu HTTPFileExists:
Das ist die Funktion, die bei einer Prüfung auf einem https-Server den Fehler "IOHandler value is not valid" auslöst: |
Da ist ja auch kein IOHandler zugewiesen, daher kann das mit https auch nicht klappen. Da die Funktion noch with verwendet, ist sie aber vermutlich auch schon sehr alt. Wenn du den IOHandler zuweist (einen TIdSSLIOHandlerSocketOpenSSL), sollte es auch klappen.
Das steht auch in der Doku (und hast du an anderer Stelle vermutlich auch schon verwendet, sonst würde ja gar nicht nach den DLLs gesucht werden):
Embarcadero Wiki: Securing Indy Network Connections [
https://docwiki.embarcadero.com/RADStudio/en/Securing_Indy_Network_Connections]
Gagga - So 16.04.23 11:37
Zu
TFileStream.Create(Ziel, fmCreate):
Ziel ist identisch. Mit Process Monitor habe ich noch nicht gearbeitet. Muss ich schauen.
Zu
HTTPFileExists:
Blöder Fehler, jetzt funktioniert es mit ergänzter Funktion:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27:
| function HTTPFileExists(aURL: String): Boolean; var URI : TIdURI; IOHandler : TIdSSLIOHandlerSocketOpenSSL; HTTP : TIdHTTP; begin HTTP := TIdHTTP.Create(nil); URI := TIdURI.Create(aURL); if URI.Protocol = 'https' then begin IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil); HTTP.IOHandler := IOHandler; end; with http do try try ReadTimeout := 5000; Head(aURL); Result := ResponseCode = 200; except Result := False; end; finally Free; end; end; |
Moderiert von Th69: Vollzitat entfernt.
Moderiert von Th69: Delphi-Tags hinzugefügt
jaenicke - So 16.04.23 14:53
Ein wenig besser angeordnet:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30:
| function HTTPFileExists(aURL: string): Boolean; var URI: TIdURI; IOHandler: TIdSSLIOHandlerSocketOpenSSL; HTTP: TIdHTTP; begin try HTTP := TIdHTTP.Create(nil); try URI := TIdURI.Create(aURL); try if URI.Protocol = 'https' then begin IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil); HTTP.IOHandler := IOHandler; end; finally URI.Free; end; HTTP.ReadTimeout := 5000; HTTP.Head(aURL); Result := HTTP.ResponseCode = 200; finally HTTP.Free; end; except Result := False; end; end; |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!