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 - Post wird doppelt ausgeführt, warum? (https://www.delphipraxis.net/59163-idhttp-post-wird-doppelt-ausgefuehrt-warum.html)

line5 18. Dez 2005 16:07


IdHTTP - Post wird doppelt ausgeführt, warum?
 
Hallo!

Ich habe eine Frage an euch:

Ich habe mir jetzt mit dem Indykomponent ein kleines UploadSkript zusammengebastelt, funktioniert auch super!
Jedoch merke ich nun mit WorkBegin, WorkEnd und OnWork plötzlich, dass der IdHTTP.Post zwei mal ausgeführt wird.
Nun fragt sich warum und wie kann man das unterbinden?

Hier der Quellcode:

Delphi-Quellcode:
//Prozedur SENDFILE
procedure TForm1.sendfile(filename:string);
var
  data: TIdMultiPartFormDataStream;
  res : string;
begin
  data := TIdMultiPartFormDataStream.Create;
  try
    data.AddFormField('dateiname', filename);
    data.AddFile('datei', filename, GetMIMETypeFromFile(filename));


    data.Position :=0;

     Memo1.Text := IdHTTP1.Post('URL', data);
  except
    showMessage('Beim Upload trat ein Fehler auf! Es konnte keine Verbinung zum Server hergestellt werden!');
end;
end;
Hoffe ihr könnt da helfen, danke schonmal!
Line5

Sougetsu 22. Okt 2013 17:59

AW: IdHTTP - Post wird doppelt ausgeführt, warum?
 
Moin zusammen,

wurde das Problem von 2005 eigtl. mal irgendwie gelöst?

Ich hab nämlich grad ein ähnliches Problem mit der INDY Komponente TIdHTTP.

Vorgestern erst ne aktuelle INDY Version installiert und die alte entfernt.

Zu den Gegebenheiten:
Auf meinem lokalhost hab ich eine xampp umgebung, das htdocs ist via .htaccess über digest Auth geschützt.

Das Program ist einfach zum testen gestrickt, INDY Kompo TIdHTTP auf die Form geknallt nen Button dazu mit OnClick event.
Beim draufdrücken wird dann gestartet, ein TIdMultipartFormDataStream erstellt und mit AddFieldForm und AddFile gefüllt.

Auf IdHTTP.POST(URL,Stream,RStream); baut INDY dann die verbindung auf und sendet den POST.
Vom Server bekommt er nun eine 401 Meldung zurück, dass Authorisiert werden muss.
idHTTP lädt den gesamten POST aber erstmal hoch bevor das OnAuthentization Event ausgelöst wird.
Somit wird erst nach dem Upload des POST die Authentifizierung verarbeitet.
INDY schließt nun die Verbindung und öffnet eine neue, sendet das POST diesmal mit der Authentisierung nochmal komplett hoch.

Im Apache Log findet man dann auch 2 neue Einträge die erste mit 401 beantwortet die 2. mit 200

Ich hab gestern mir ziemlich stark den Kopf zerbrochen wie man das evtl. umgehen könnte.
Da waren dann so versuche wie, erst im OnAuthentization den multi Stream der idHTTP.Request.Source anzuhängen.
Doch war das ergebnis leider auch doppel POST.

Kann es sich hier evtl. um einen BUG handeln oder sowas in der Richtung.

Die meisten suchen gingen in Richtung Basic Auth.
Das ziehmlich nächste war dieser Thread der meiner Suche am nächsten kommt.
Man findet die Konstellation aber auch fast garnicht im netz.
Indy Forum, Embarcadero Archiv etc.

Hoffe hier lässt sich jemand finden der das schon mal gemacht hat oder vllt. einfach nur die Lösung dazu kennt den 1. POST zu stoppen
und erst nach dem Auth den gesammten POST schickt.

LG aus Cologne
Sougetsu


EDIT:
ok das scheint ein generelles Problem zu sein.
Habe firefox mal genau so dazu gebracht, dass im firefox eine Seite aufgerufen die nicht mit htaccess geschützt wird und auf diese Seite eine FORM eingebettet die den POST dann an die Seite sendet die mit htaccess geschützt wird.
Firefox hat dabei genau das Gleiche gemacht wie die Delphi Anwendung. Erst mal den ganzen POST hochgeladen und mir dann das Authentifizierungsfenster angezeigt.
Nach der Authentifizierung dann nochmals den POST verschickt.
Ist ja auch klar, der Server kann erst agieren, wenn er den ganzen Request bekommen hat und dann mit seinem Respond Antworten.
Übers www macht man das ja auch normalerweise, man betritt eine Seite und wenn die geschützt ist bekommt man die Aufforderung sich anzumelden, danach bekommt man dann erst die Seite angezeigt mit formular und allem. Wenn man das dann ausfüllt und absendet kennt der Browser ja schon die Logindaten bzw kann evtl. den vorherigen access nutzen.
OK, jetzt müsste man nur noch indy dazu bekommen, dass es die TIdAuthorization oder was da passiert behält.
Denn bis jetzt, wenn ich 2 IdHTTP1.Post() schalte muss es sich auch 2x authentifizieren.

Sougetsu 24. Okt 2013 20:59

AW: IdHTTP - Post wird doppelt ausgeführt, warum?
 
Moin

hab noch ein bisschen ausprobiert, aber wie es aussieht scheint die IdHTTP das nicht voll zu unterstützen, die nonce wird bei jedem Request verworfen.
Nach dem GET/POST kann man zwar noch auch die RawHeader zugreifen, hab dann versucht den Respondcode bei jedem Request selber zu berechnen und die dem Header
dann über Request.CustemHeaders mit zu senden, doch IdHTTP überschreibt es wieder und der Server antwortet erneut mit 401.
das sagt mir zumindest der Netzwerkmonitor.

Werd dann wohl erstmal auf die Loginform via HTML/PHP zurückgreifen um die Seite zu schützen.

LG
Sougetsu

Andreas L. 25. Okt 2013 08:10

AW: IdHTTP - Post wird doppelt ausgeführt, warum?
 
Vor einiger Zeit habe ich für einen Kunden eine Anmeldung via Digest Auth entwickeln müssen. Egal was ich versucht habe, mit TIdHTTP ging es einfach nicht. Ich bin dann auf die Internet Component Suite von Overbyte ausgewichen, damit klappt alles hervorragend.

CCRDude 25. Okt 2013 09:26

AW: IdHTTP - Post wird doppelt ausgeführt, warum?
 
Mit Digest Auth hatte ich mit (der mitgelieferten Version von) Indy auch Probleme, fand das im Netz dokumentiert - die aktuelle Indy-Version nachzurüsten hat dabei geholfen.

jaenicke 25. Okt 2013 10:21

AW: IdHTTP - Post wird doppelt ausgeführt, warum?
 
Funktioniert vielleicht vorher eine Head Anfrage? Denn wenn die Authentifizierung dann dort auch abgefragt und bestätigt wurde, könnte man diese vielleicht für den folgenden Post Request weiter nutzen.

Aber das ist nur eine Vermutung, selbst habe ich mit dem Event noch nichts gemacht.

Sougetsu 25. Okt 2013 17:22

AW: IdHTTP - Post wird doppelt ausgeführt, warum?
 
Moin,

das hört sich nach einer Alternative an, hatte von der auch schon mal gehört.
Nur wie aktuell oder veraltet ist die ICS Kompo Andreas? Und was noch wichtiger
wäre, unterstützt es TLS 1.2?

CCRDude, das hatte ich auch gehofft. Hab mir die letzte SVN gezogen vor ein paar Tagen erst.
Doch scheint die Implementierung nicht vollständig zu sein. Da es so aussieht als würde die Kompo das Timeout der Gültigkeit der erfolgreichen Authorisierung + der Nonce am Ende verwerfen.

jeanicke, das hab ich natürlich auch versucht, gestern nach dem post hier hab ich mir
den code nochmal angeschaut und da ist mir auch ein kleiner vopa aufgefallen.
Hatte ja gehofft, dass wenn ich erst ein GET abschicke um die nonce zu erhalten, das es dann
mit dem direkt darauffolgenden POST klappen würde.
Doch die Request Methode wird mit in die Berechnung der Digest Authorisierung einbezogen.
Somit hilft die Methode HEAD leider auch nicht.

Hab das jetzt so umgangen, das ich erst ein Dummy POST rausgebe um nach der 401 zu hunten,
und im 2ten POST dann mit der Autorisierung, klappt soweit auch.

Der 3te POST rennt dann wieder gegen eine 401. Wäre natürlich toll wenn man das auch noch
irgendwie gelöst bekommen könnte.

Also ich denke indy muss da nochmal nachbessern, das die Timeouts + den NC Counter (hex)
gecheckt werden ob die erhaltene Nonce noch gültig ist um eine weiter response zu generieren.
Damit man weiterhin autorisiert bleibt.

Der Server sagt unter anderem auch wie oft man die nonce max nutzen darf, mein
Apache gibt mir dafür im header die max=99 zurück.


LG
Sougetsu

Edit:
So sieht das dann mit Dummy aus, für die die sich mit der selben Problematik befassen. Nicht elegant das für jeden Request zu machen, aber es funktioniert.
Delphi-Quellcode:
s:=IdHttp1.POST(URL, multi); // Ein Post-Request der als Dummy genutzt wird, mulri ist dabei ein leerer Stream. Indy bearbeitet die Authorisierung voll automatisch
multi.AddFormField('Test', 'Test');
multi.AddFile(Datei);
s:=IdHttp1.POST(URL, multi); // Der eigentliche Post-Request mit gefülltem multi Stream + gültiger Authorisierung.

Andreas L. 26. Okt 2013 12:20

AW: IdHTTP - Post wird doppelt ausgeführt, warum?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi Sougetsu,

Zitat:

Zitat von Sougetsu (Beitrag 1233202)
das hört sich nach einer Alternative an, hatte von der auch schon mal gehört.
Nur wie aktuell oder veraltet ist die ICS Kompo Andreas?

Die Komponenten werden weiter entwickelt, sind aber seit ein paar Monaten kostenpflichtig. Ich setze Version 8 Beta ein, diese war damals noch kostenfrei (OpenSource) verfügbar. Anbei das Archiv.

Zitat:

Zitat von Sougetsu (Beitrag 1233202)
Und was noch wichtiger
wäre, unterstützt es TLS 1.2?

SSL wird unterstützt wenn ein bestimmter Compiler-Schalter gesetzt wird und außerdem die nötigen SSL-Dlls vorhanden sind.

Sougetsu 26. Okt 2013 16:53

AW: IdHTTP - Post wird doppelt ausgeführt, warum?
 
Hi Andreas,

danke für dein reply.
Oh das ist jetzt auch kostenpflichtig geworden. K, gut zu wissen.
Danke für das sheren der 8Beta Version. Die DLL's sind vorhanden.

Werde diese mal bei Gelegenheit einsehen. Momentan werd ich aber erstmal
weiter bei den Indys bleiben.

LG aus Cologne
Sougetsu

hstreicher 26. Okt 2013 18:11

AW: IdHTTP - Post wird doppelt ausgeführt, warum?
 
also auf der Overbyte.be Webseite steht FREEWARE , bei ICS


Alle Zeitangaben in WEZ +1. Es ist jetzt 20: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