Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Datei aus dem Internet herunterladen - geht nicht mehr! (https://www.delphipraxis.net/198893-datei-aus-dem-internet-herunterladen-geht-nicht-mehr.html)

NicoleWagner 29. Dez 2018 22:12

AW: Datei aus dem Internet herunterladen - geht nicht mehr!
 
Wie kann ich Deine geniale Zeile:

//IOHndl.SSLOptions.SSLVersions := [sslvTLSv1_2]; // erzwingt TSL-Protokoll 1.2
so anwenden, dass ich HIER den Fehler richtig ausgebe?


ShowMessage(idHTTP1.Get('https://*****.pdf'));

Indy, - ich brauche es nie wieder, auch wenn es mich sehr interessieren würde.
Ich arbeite an einem finanzmathematischen Projekt. Die Dinge, die ich dazu brauche, hätte ich auch mit Delphi 5 oder so gestalten können. Uralte höhere Mathematik. Nur dieser eine Input läuft eben soviel komfortabler, wenn ich den Input aus dem pdf-File reinbastle.

NicoleWagner 29. Dez 2018 22:15

AW: Datei aus dem Internet herunterladen - geht nicht mehr!
 
Danke für die Links zu den Zertifikaten. Sie erschlagen mich.
Vielleicht geht es, wenn es früher am Tag ist (23:15).
Ich habe sie einmal alle aufgerufen und lasse sie im Browser geöffnet.

Prosit 2019 allen, die noch mitlesen um die nahen Feiertage!

Delphi.Narium 29. Dez 2018 22:25

AW: Datei aus dem Internet herunterladen - geht nicht mehr!
 
Welchen Quelltext nutzt Du denn jetzt aktuell bitte?

Nur das?

Delphi-Quellcode:
ShowMessage(idHTTP1.Get('https://*****.pdf'));

Sonst nix?

Wo wird die TIdSSLIOHandlerSocketOpenSSL-Komponente zugewiesen und wie ist sie konfiguriert?

Oder nutzt Du den Quelltext aus Post #38?
Dort bitte Zeile einfügen:
Delphi-Quellcode:
 // im Construtor
 ReadTimeout := 3000;
 ConnectTimeout := 3000;
 IOHndl.ReadTimeout := 3000;
 IOHndl.ConnectTimeout := 3000;
 // hier einfügen:
 IOHndl.SSLOptions.SSLVersions := [sslvTLSv1_2]; // erzwingt TSL-Protokoll 1.2

NicoleWagner 3. Jan 2019 20:24

AW: Datei aus dem Internet herunterladen - geht nicht mehr!
 
Bitte gehe in Zeile 180 oder springe auf 'Form1.SpeedButton1Click'.
Darunter stehen 2 Methoden, in denen ich verschiedene Zeilen probierte.
Jeweils darunter stehen die Fehlermeldungen, die auf diese Zeilen folgten:
Delphi-Quellcode:
unit Unit_Download_Url;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, VCLTee.TeCanvas,
  Vcl.Buttons, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
  IdHTTP, IdSSLOpenSSL, IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack, IdSSL;

type
  TForm1 = class(TForm)
    SpeedButton1: TSpeedButton;
    SpeedButton2: TSpeedButton;
    IdHTTP1: TIdHTTP;
    IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL;
    SpeedButton3: TSpeedButton;

    procedure SpeedButton1Click(Sender: TObject);
    procedure SpeedButton2Click(Sender: TObject);

  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;


var
  Form1: TForm1;

//******************************************************************************
implementation

{$R *.dfm}


type
 THTTPFileDownload = class(TIdHTTP)
 private
  FProgress: Integer;
  FWorkCount, FBytesTransfered, FBytesToTransfer, FBytesTransferedEnd: Int64;
  FOnChange, FOnEnd: TNotifyEvent;
  IOHndl: TIdSSLIOHandlerSocketOpenSSL;
  procedure ResetVars;
  procedure HTTPWorkBegin(ASender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Int64);
  procedure HTTPWork(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64);
  procedure HTTPWorkEnd(Sender: TObject; AWorkMode: TWorkMode);
  procedure SetProgress(const Value: Integer);
  procedure SetOnChange(const Value: TNotifyEvent);
  procedure SetOnEnd(const Value: TNotifyEvent);
 public
  constructor Create(AOwner: TComponent);
  destructor Destroy; override;
  function DownloadFile(const aFileUrl: string; const aDestinationFile: string): Boolean;

  property Progress: Integer read FProgress write SetProgress;
  property WorkCount: Int64 read FWorkCount write FWorkCount;
  property BytesTransfered: Int64 read FBytesTransfered write FBytesTransfered;
  property BytesTransferedEnd: Int64 read FBytesTransferedEnd write FBytesTransferedEnd;
  property BytesToTransfer: Int64 read FBytesToTransfer;
  property OnChange: TNotifyEvent read FOnChange write SetOnChange;
  property OnEnd: TNotifyEvent read FOnEnd write SetOnEnd;
 end;

//******************************************************************************

constructor THTTPFileDownload.Create(AOwner: TComponent);
begin
 inherited;

 IOHndl := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
 Request.BasicAuthentication := True;
 HandleRedirects := True;
 IOHandler := IOHndl;

 ReadTimeout := 3000;
 ConnectTimeout := 3000;
 IOHndl.ReadTimeout := 3000;
 IOHndl.ConnectTimeout := 3000;

 OnWork := HTTPWork;
 OnWorkBegin := HTTPWorkBegin;
 OnWorkEnd := HTTPWorkEnd;
end;

destructor THTTPFileDownload.Destroy;
begin
 IOHndl.Free;

 inherited;
end;

procedure THTTPFileDownload.ResetVars;
begin
 Progress := 0;
 FWorkCount := 0;
 FBytesToTransfer := 0;
 FBytesTransfered := 0;
end;

function THTTPFileDownload.DownloadFile(const aFileUrl: string; const aDestinationFile: string): Boolean;
var
 LDestStream: TFileStream;
 aPath: string;
begin
 try
  ResetVars;
  aPath := ExtractFilePath(aDestinationFile);

  if aPath <> '' then
   ForceDirectories(aPath);

  LDestStream := TFileStream.Create(aDestinationFile, fmCreate);
  try
   Get(aFileUrl, LDestStream);
   Result := True;
  finally
   FreeAndNil(LDestStream);
  end;
 except
  Result := False;
 end;
end;

procedure THTTPFileDownload.HTTPWork(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64);
begin
 if BytesToTransfer = 0 then // No Update File
  Exit;

 WorkCount := AWorkCount;
 Progress := Round((AWorkCount / BytesToTransfer) * 100);
 BytesTransfered := (BytesToTransfer div 100) * Progress;
end;

procedure THTTPFileDownload.HTTPWorkBegin(ASender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Int64);
begin
 FBytesToTransfer := AWorkCountMax;
end;

procedure THTTPFileDownload.HTTPWorkEnd(Sender: TObject; AWorkMode: TWorkMode);
begin
 FBytesTransferedEnd := FBytesTransfered;
 if Assigned(FOnEnd) then
  FOnEnd(Self);

 FWorkCount := 0;
 FBytesToTransfer := 0;

 ResetVars;

 Progress := 100;
end;

procedure THTTPFileDownload.SetOnChange(const Value: TNotifyEvent);
begin
 FOnChange := Value;
end;

procedure THTTPFileDownload.SetOnEnd(const Value: TNotifyEvent);
begin
 FOnEnd := Value;
end;

procedure THTTPFileDownload.SetProgress(const Value: Integer);
begin
 FProgress := Value;

 if Assigned(FOnChange) then
  FOnChange(Self);
end;
//******************************************************************************
//******************************************************************************

procedure TForm1.SpeedButton1Click(Sender: TObject); //  forciert TSL 1.2
var
  DL: THTTPFileDownload;
begin
  DL := THTTPFileDownload.Create(nil);
  try

  DL.IOHndl.SSLOptions.SSLVersions := [sslvTLSv1_2]; // erzwingt TSL-Protokoll 1.2

  DL.DownloadFile('https://www.delphipraxis.net/','C:\Termin\xxx.pdf');

  // das geht vermutlich, es kommt jedenfalls keine Fehlermeldung,
  // doch was genau passiert liegt im Nebel und debuggen würde zu lange dauern,
  // weil ich pdf Files in der VM nicht mit Doppelklick öffnen kann.


    DL.DownloadFile('https://....Link.pdf','C:\Termin\xxx.pdf'); // => zeigt auf meine Datei im Internet


//   ---------------------------
//Benachrichtigung über Debugger-Exception
//---------------------------
//Im Projekt Project_Download_Url.exe ist eine Exception der Klasse EIdHTTPProtocolException mit der Meldung 'HTTP/1.1 500 Internal Server Error' aufgetreten.
//---------------------------
//Anhalten  Fortsetzen  Hilfe
//---------------------------


  finally
    DL.Free;
  end;
end;
//******************************************************************************

procedure TForm1.SpeedButton2Click(Sender: TObject);
begin
    ShowMessage(idHTTP1.Get('https://192.124.249.57/documents/shared/margins/margins.pdf'));

//    ---------------------------
//Benachrichtigung über Debugger-Exception
//---------------------------
//Im Projekt Project_Download_Url.exe ist eine Exception der Klasse EIdOSSLUnderlyingCryptoError mit der Meldung 'Fehler beim Verbinden mit SSL.
//error:1409442E:SSL routines:ssl3_read_bytes:tlsv1 alert protocol version' aufgetreten.
//---------------------------
//Anhalten  Fortsetzen  Hilfe
//---------------------------


    // gefolgt von



//---------------------------
//Project_download_url
//---------------------------
//Fehler beim Verbinden mit SSL.//
//error:1409442E:SSL routines:ssl3_read_bytes:tlsv1 alert protocol version.
//---------------------------
//OK
//---------------------------




end;


end.

Michael II 3. Jan 2019 22:17

AW: Datei aus dem Internet herunterladen - geht nicht mehr!
 
Das Wild Card Zertifikat wurde für sucuri.net und alle Subdomains ausgestellt [und nicht für den Server und alle darauf gehosteten Domains].

Ersetze also die IP Adresse durch <subdomain>.sucuri.net

Delphi.Narium 4. Jan 2019 11:47

AW: Datei aus dem Internet herunterladen - geht nicht mehr!
 
HTTP/1.1 500 Internal Server Error heißt eigentlich, dass die Gegenseite schon irgendwie antwortet, aber halt dabei innerhalb der Gegenseite ein Fehler auftritt.

Vermutlich kann dieser Fehler erst gemeldet werden, wenn die Verbindung bereits erfolgreich hergestellt wurde.

Hast Du auf der VM 'nen Browser?
Dann kannst Du die PDF (höchstwahrscheinlich) mit dem anzeigen lassen. Einfach mal den Browser öffnen und die PDF aus dem Explorer in den Browser ziehen oder halt über das Menü Datei / Datei öffnen auswählen.

Geht das nicht, dann die Datei mal mit Notepad öffnen. Solange Du sie nicht mit Notepad speicherst, sollte das gehen. PDF-Dateien beginnen in der Regel mit der Zeichenfolge %PDF-1.4.
Wenn in der PDF dort was anderes steht, teile uns das bitte mit (sofern es Infos sind, die Du veröffentlichen kannst / darfst).

Die Funktion THTTPFileDownload.DownloadFile bitte ändern:
Delphi-Quellcode:
function THTTPFileDownload.DownloadFile(const aFileUrl: string; const aDestinationFile: string): Boolean;
var
 LDestStream: TFileStream;
 aPath: string;
 s : String;
begin
 try
  ResetVars;
  aPath := ExtractFilePath(aDestinationFile);

  if aPath <> '' then
   ForceDirectories(aPath);

  LDestStream := TFileStream.Create(aDestinationFile, fmCreate);
  try
   try
     Get(aFileUrl, LDestStream);
     Result := True;
   except
    on e : Exception do begin
      s := 'ResponseCode: ' + IntToStr(ResponseCode) + #13
         + 'ResponseText: ' + ResponseText + #13
         + 'Server: ' + Response.Server + #13
         + 'Location: ' + Response.Location + #13
         + 'AcceptPatch: ' + Response.AcceptPatch + #13
         + 'AcceptRanges: ' + Response.AcceptRanges + #13
         + 'CharSet: ' + Response.CharSet + #13
         + 'CacheControl: ' + Response.CacheControl + #13
         + 'Date: ' + DateTimeToStr(Response.Date) + #13
         + 'Expires: ' + DateTimeToStr(Response.Expires) + #13
         + 'LastModified: ' + DateTimeToStr(Response.LastModified) + #13
         + 'TransferEncoding: ' + Response.TransferEncoding + #13
      ;
      case Response.ResponseVersion of
        pv1_0 : s := s + 'ResponseVersion: 1.0' + #13;
        pv1_1 : s := s + 'ResponseVersion: 1.1' + #13;
      else
        s := s + 'ResponseVersion: unbekannt' + #13;
      end;
      s := s + #13#13 + e.Message;
      MessageDlg(s,mtError,[mbOk],0);
   end;
  finally
   FreeAndNil(LDestStream);
  end;
 except
  on e : Exception do begin
    Result := False;
    MessageDLG(e.Message,mtError,[mbOk],0);
  end;
 end;
end;
Bitte informiere uns über die daraus resultierende Fehlermeldung. (Sofern da Angaben drinne sind, die Du nicht zeigen darfst, anonymisiere sie bitte so, dass der ursprüngliche Sinn der Aussage erhalten bleibt.)

Da das Ganze hier nur "hingedaddelt" ist, kann ich Schreib-/Syntaxfehler nicht ausschließen.

NicoleWagner 5. Jan 2019 16:14

AW: Datei aus dem Internet herunterladen - geht nicht mehr!
 
jaaaaaaaaaaaaaaaaaaaaaaaaaa !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
:cheer::cheer::cheer:
Es geht.

Danke Leute, danke, dass Ihr mir 10 Seiten lang zur Seite gestanden habt.

Michael II schrieb den Satz, der der letzte Schritt war:
Ich muss die IP-Nummer wieder zurückstellen auf den Namen der Domain.

Doch es waren wohl alle Faktoren, ganz wesentlich das Erzwingen vom Protokolls TSL 1.2
und natürlich erst mal herauszufinden, dass der Fehler dort liegt. Und das Auslesen, welchse Protokoll ich konkret brauche.

Ich habe sehr viel gelernt. Danke auch allen für die vielen Codeschnipsel und Links.
Jetzt mache ich mich mal dran, die Testumgebung in mein Programm zu implementieren.


Nicole


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:14 Uhr.
Seite 3 von 3     123   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz