Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi idhttp + Redirect behandeln (https://www.delphipraxis.net/167989-idhttp-redirect-behandeln.html)

codipodi 29. Apr 2012 09:21

idhttp + Redirect behandeln
 
Hallo zusammen,
ich habe folgendes Problem mit der IndyHTTPGetThreaded Demo von Luckie:
http://www.michael-puff.de/Programmi...etThreaded.zip

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

codipodi 2. Mai 2012 07:37

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

Klaus01 2. Mai 2012 07:44

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

codipodi 2. Mai 2012 08:00

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

Klaus01 2. Mai 2012 08:22

AW: idhttp + Redirect behandeln
 
Zitat:

Zitat von codipodi (Beitrag 1164516)
Ich habe aber das Gefühl das trotzdem bei jedem Redirect das FWorkEndevent ausgelöst wird. Oder ist das nicht korrekt?

.. da bin ich mir nicht 100%ig sicher.
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:
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;
Grüße
Klaus

codipodi 2. Mai 2012 08:28

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

codipodi 4. Mai 2012 08:46

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

geskill 4. Mai 2012 09:59

AW: idhttp + Redirect behandeln
 
Zitat:

Zitat von codipodi (Beitrag 1164521)
Dann allerdings wieder neu anfängt die Datei zu laden. Daher halte ich diesen Effekt für einen Redirect.

Hallo,
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

codipodi 4. Mai 2012 10:46

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

shmia 4. Mai 2012 16:21

AW: idhttp + Redirect behandeln
 
Zitat:

Zitat von codipodi (Beitrag 1164808)
Entweder habe ich ein Brett vor dem Kopf

Yes, Sir. :wink:
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 13:48 Uhr.
Seite 1 von 2  1 2      

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