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. |
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! |
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 |
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. |
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 |
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:
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.)
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; Da das Ganze hier nur "hingedaddelt" ist, kann ich Schreib-/Syntaxfehler nicht ausschließen. |
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. |
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