AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi IdHTTP - Post wird doppelt ausgeführt, warum?
Thema durchsuchen
Ansicht
Themen-Optionen

IdHTTP - Post wird doppelt ausgeführt, warum?

Ein Thema von line5 · begonnen am 18. Dez 2005 · letzter Beitrag vom 27. Okt 2013
Antwort Antwort
Seite 1 von 2  1 2      
line5

Registriert seit: 22. Mär 2004
1 Beiträge
 
#1

IdHTTP - Post wird doppelt ausgeführt, warum?

  Alt 18. Dez 2005, 16:07
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
  Mit Zitat antworten Zitat
Sougetsu

Registriert seit: 18. Feb 2009
20 Beiträge
 
#2

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

  Alt 22. Okt 2013, 17:59
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.

Geändert von Sougetsu (22. Okt 2013 um 22:23 Uhr)
  Mit Zitat antworten Zitat
Sougetsu

Registriert seit: 18. Feb 2009
20 Beiträge
 
#3

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

  Alt 24. Okt 2013, 20:59
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
  Mit Zitat antworten Zitat
Andreas L.

Registriert seit: 23. Mai 2011
Ort: Furth im Wald
308 Beiträge
 
Delphi 11 Alexandria
 
#4

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

  Alt 25. Okt 2013, 08:10
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.
Andreas Lauß
Blog
  Mit Zitat antworten Zitat
CCRDude

Registriert seit: 9. Jun 2011
675 Beiträge
 
FreePascal / Lazarus
 
#5

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

  Alt 25. Okt 2013, 09:26
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.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.346 Beiträge
 
Delphi 11 Alexandria
 
#6

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

  Alt 25. Okt 2013, 10:21
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Sougetsu

Registriert seit: 18. Feb 2009
20 Beiträge
 
#7

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

  Alt 25. Okt 2013, 17:22
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.

Geändert von Sougetsu (25. Okt 2013 um 17:43 Uhr)
  Mit Zitat antworten Zitat
Andreas L.

Registriert seit: 23. Mai 2011
Ort: Furth im Wald
308 Beiträge
 
Delphi 11 Alexandria
 
#8

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

  Alt 26. Okt 2013, 12:20
Hi Sougetsu,

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.

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.
Angehängte Dateien
Dateityp: zip OverbyteIcsV8beta.zip (4,10 MB, 6x aufgerufen)
Andreas Lauß
Blog
  Mit Zitat antworten Zitat
Sougetsu

Registriert seit: 18. Feb 2009
20 Beiträge
 
#9

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

  Alt 26. Okt 2013, 16:53
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
  Mit Zitat antworten Zitat
hstreicher

Registriert seit: 21. Nov 2009
220 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#10

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

  Alt 26. Okt 2013, 18:11
also auf der Overbyte.be Webseite steht FREEWARE , bei ICS
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:19 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