![]() |
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:
Hoffe ihr könnt da helfen, danke schonmal!
//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; Line5 |
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. |
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 |
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.
|
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.
|
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. |
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. |
AW: IdHTTP - Post wird doppelt ausgeführt, warum?
Liste der Anhänge anzeigen (Anzahl: 1)
Hi Sougetsu,
Zitat:
Zitat:
|
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 |
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 14:43 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