Autor |
Beitrag |
Gagga
Beiträge: 103
Win 11
Delphi 12 Athen Pro
|
Verfasst: Sa 15.04.23 12:25
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
Beiträge: 19285
Erhaltene Danke: 1743
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 16.04.23 01:59
|
|
Gagga
Beiträge: 103
Win 11
Delphi 12 Athen Pro
|
Verfasst: 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
Beiträge: 19285
Erhaltene Danke: 1743
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 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
|
|
Gagga
Beiträge: 103
Win 11
Delphi 12 Athen Pro
|
Verfasst: 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
Beiträge: 19285
Erhaltene Danke: 1743
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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; |
Für diesen Beitrag haben gedankt: Gagga
|
|
|