![]() |
idhttp + Redirect behandeln
Hallo zusammen,
ich habe folgendes Problem mit der IndyHTTPGetThreaded Demo von Luckie: ![]() Der Downloadthread soll eine Prozedur aufrufen (updatedata) welche natürlich erst dann ausgeführt werden soll wenn der Download komplett fertig ist. Jetzt habe ich jedoch das Problem das teilweise ein oder mehrere Redirects erfolgen und der Downloadthread meiner Meinung nach jedes mal das FWorkEndevent auslöst. Ist die Analyse soweit korrekt? Falls ja, wie kann ich das beheben? Ich habe mir folgendes gebastelt, aber es scheint nicht komplett zu funktionieren. Teilweise lädt er dann komplett herunter aber führt ShowEnd nicht aus.
Delphi-Quellcode:
idHTTP.OnRedirect:=erkenneredirect;
Delphi-Quellcode:
procedure TDownloadThread.erkenneredirect(Sender: TObject; var dest: string; var
NumRedirect: Integer; var Handled: Boolean; var VMethod: string); begin Handled := True; redirectnr:=redirectnr+1; end;
Delphi-Quellcode:
procedure TDownloadThread.FWorkEndevent(ASender: TObject; AWorkMode: TWorkMode);
begin if redirectnr <= 0 then Synchronize(ShowEnd) else redirectnr:=redirectnr-1; end;
Delphi-Quellcode:
procedure TDownloadThread.ShowEnd;
begin form1.updatedata; end; PS: Ich habe das Thema am 26.04 im delphi-forum geposted, dort konnte mir jedoch keiner helfen. Sollten wir hier ein Ergebnis erzielen werde ich es dann dort auf diesen Topic verweisen. Danke! LG, Christian |
AW: idhttp + Redirect behandeln
Hallo nochmal,
also ich muss ehrlich zugeben, ich verstehe nicht warum niemand antwortet. Mir ist bewusst das ich dem Forum bislang noch nichts zurückgeben konnte, aber ich habe mich ja auch gerade erst angemeldet. Oder liegt es an der Fragestellung? Bitte helft mir oder erklärt mir zumindest warum Hilfe nicht möglich ist. Ich mache mir jetzt seit über einer Woche Gedanken zu dieser Thematik und bin langsam verzweifelt. Vielen Dank. LG, Christian |
AW: idhttp + Redirect behandeln
Guten Morgen Christian,
du kannst doch die Eigenschaft .HandleRedirect des idHttp Clients auf true setzen, dann musst Du dich nicht selber mit den redirects rumschlagen. Dann noch zum Grundverständnis meinerseits, warum treten Redirects auf, wenn ich ein File laden will. Ich meine Redirects treten nur dann auf bis man die Datei gefunden hat. request an WebServer -> redirect - WebServer2 -> redirect - WebServer3 - hier liegt die Datei. Grüße Klaus |
AW: idhttp + Redirect behandeln
Hallo Klaus,
vielen Dank für deine Antwort. Also der idhttp steht bereits auf HandleRedirects=true. Ich habe aber das Gefühl das trotzdem bei jedem Redirect das FWorkEndevent ausgelöst wird. Oder ist das nicht korrekt? Vielen Dank. LG, Christian |
AW: idhttp + Redirect behandeln
Zitat:
Bei jedem Redirect wird ja auch eine Information zum Client zurückgeschickt (die neue URL) es ist durchaus nachvollziehbar das dadurch (wenn die Information komplett beim Client angekommen ist) ein WorkEnd Event ausgelöst wird. Aber sollte HandleRedirect dieses nicht vermeiden?
Delphi-Quellcode:
Grüße
procedure TDownloadThread.Execute;
var IdHTTP: TIdHTTP; begin IdHTTP := TIdHTTP.Create(nil); try idHTTP.HandleRedirects := true; // hast Du das eingefügt? IdHTTP.OnWorkBegin := FWorkBeginEvent; //FWorkBeginEvent; IdHTTP.OnWork := FWorkEvent; IdHTTP.OnWorkEnd := FWorkEndevent; FCode := IdHTTP.Get(URL); finally IdHTTP.Free; end; Synchronize(ShowCode); end; Klaus |
AW: idhttp + Redirect behandeln
Hallo Klaus,
erneut besten Dank für deine Antwort. Die Zeile hatte ich bereits integriert. Aber irgendwie habe ich das Gefühl das dennoch das EndEvent ausgelöst wird. Je nach URL habe ich mit eigenen Augen gesehen das der Fortschrittsbalken komplett bis zum Ende springt innerhalb einer Sekunde und das EndEvent auslöst. Dann allerdings wieder neu anfängt die Datei zu laden. Daher halte ich diesen Effekt für einen Redirect. Durch dieses vorzeitige auslösen des EndEvents kann die Datei natürlich nicht weiterverarbeitet werden da sie ja noch garnicht richtig heruntergeladen wurde. LG, Christian |
AW: idhttp + Redirect behandeln
Nochmal ein Hilferuf an alle:
Wie kann ich das Problem lösen? Entweder habe ich ein Brett vor dem Kopf oder das Problem ist doch größer als gedacht. Ich habe leider überhaupt keine Idee wie ich diesen Fehler aus der Welt schaffen kann, meine gepostete Lösung funktioniert ja anscheinend nicht. Über Hilfe und Anmerkungen jeglicher Art wäre ich wirklich äußerst dankbar. in verzweifelter Hoffnung, Christian |
AW: idhttp + Redirect behandeln
Zitat:
mittels Wireshark lässt sich der komplette Datenverkehr aufzeichnen. Damit solltest du problemlos herausbekommen ob es eine Weiterleitung gibt. Ich glaube eher, dass die Fortschrittsbalken etwas spinnen weil es da immer wieder mal Probleme mit der Firewall o.ä. gibt. Mit dem Debugger Haltepunkte setzen und durch den Code steppen wäre auch noch eine Möglichkeit :) Ein weiterer möglicher Ansatz wäre mit der Dateigröße zu arbeiten (TIdHTTP.Response.ContentLength) und immer zu schauen, wie viel hat er im OnWork-Work Event gerade herunter geladen (was fehlt noch). Und zuletzt bleibt mir noch zu sagen, dass es natürlich immer besser ist mit einer aktuellen Indy Version zu arbeiten. Grüße |
AW: idhttp + Redirect behandeln
Hallo Sebastian,
vielen Dank für deine Antwort. Das Problem ist allerdings das nicht nur der Balken vorspringt sondern auch das Endevent ausgelöst wird. Ich habe dies überprüft. Wenn mir niemand sagen kann warum meine Prozedur nicht funktioniert, gibt es dann eine andere Möglichkeit zu erkennen ob das Event zu früh ausgelöst wird? Ich werde zunächst versuchen zu prüfen ob TIdHTTP.Response.ContentLength zu klein für eine richtige Datei ist. LG, Christian |
AW: idhttp + Redirect behandeln
Zitat:
Delphi-Quellcode:
procedure TDownloadThread.Execute;
var IdHTTP: TIdHTTP; begin IdHTTP := TIdHTTP.Create(nil); try idHTTP.HandleRedirects := true; // hast Du das eingefügt? IdHTTP.OnWorkBegin := FWorkBeginEvent; //FWorkBeginEvent; IdHTTP.OnWork := FWorkEvent; IdHTTP.OnWorkEnd := FWorkEndevent; FCode := IdHTTP.Get(URL); // HIER !! // ist die Stelle, an der alle Redirekts ausgeführt wurden // und die Daten heruntergeladen wurden (oder auch nicht falls Status <> 200) finally IdHTTP.Free; end; Synchronize(ShowCode); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz