Autor Beitrag
Gagga
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 95

Win 11
Delphi 12 Athen Pro
BeitragVerfasst: 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:

ausblenden 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);
    //IOHandler.SSLOptions.Method := sslvSSLv3;
    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 user profile iconTh69: Delphi-Tags hinzugefügt
Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19274
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 16.04.23 01:59 
user profile iconGagga hat folgendes geschrieben Zum zitierten Posting springen:
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.).

user profile iconGagga hat folgendes geschrieben Zum zitierten Posting springen:
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?

user profile iconGagga hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 95

Win 11
Delphi 12 Athen Pro
BeitragVerfasst: 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:

ausblenden 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(nildo
  try
    try
   ReadTimeout := 5000;
      Head(aURL);
      Result := ResponseCode = 200;
    except
      Result := False;
    end;
  finally
    Free;
  end;
end;


Moderiert von user profile iconTh69: Vollzitat entfernt.
Moderiert von user profile iconTh69: Delphi-Tags hinzugefügt
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19274
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 16.04.23 11:03 
user profile iconGagga hat folgendes geschrieben Zum zitierten Posting springen:
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, ...).

user profile iconGagga hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 95

Win 11
Delphi 12 Athen Pro
BeitragVerfasst: 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:

ausblenden 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);
    //IOHandler.SSLOptions.Method := sslvSSLv3;
    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 user profile iconTh69: Vollzitat entfernt.
Moderiert von user profile iconTh69: Delphi-Tags hinzugefügt
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19274
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 16.04.23 14:53 
Ein wenig besser angeordnet:
ausblenden 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);
          // IOHandler.SSLOptions.Method := sslvSSLv3;
          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