Frage

Ich habe Probleme einen HTTP-Server mit indy 10 in delphi 2007 zur Durchführung.

Ich habe einen einfachen Ereignishandler für die CommandGet Veranstaltung.

Wenn die Daten Antwort geschickt, um die GET-Methode kann ich die params analysieren und senden XML-Daten zurück ohne Probleme. (Siehe Code unten)

    Download := ARequestInfo.Params.Values['dld'];
    Config := ARequestInfo.Params.Values['config'];
    Flash := ARequestInfo.Params.Values['flash'];
    Employees := ARequestInfo.Params.Values['employees'];
    Schedule := ARequestInfo.Params.Values['schedules'];
    AppTables := ARequestInfo.Params.Values['apptables'];

    Heartbeat :=  NewHeartbeat;

    Heartbeat.Version.Dld := Download;
    Heartbeat.Version.Config := Config;
    Heartbeat.Version.Flash := Flash;
    Heartbeat.Version.Employee := Employees;
    Heartbeat.Version.Schedule := Schedule;
    Heartbeat.Version.AppTables := AppTables;

    AResponseInfo.ContentType := 'application/xml';
    AResponseInfo.ResponseNo := 200;
    AResponseInfo.ContentText := '<?xml version="1.0" encoding="utf-8"?>' +
      #13+#10 + FormatXMLData(Heartbeat.XML);

Wenn ich versuche, auf die Daten, um zu antworten, dass ein POST die Antwort gesendet wird, verwendet, wird nie von indy gesendet, sondern ein EidConnClosedGracefully durch TIdIOHandler.WriteDirect hebt die CheckForDisconnect (True, True) Linie bilden. hier ist, wie ich die eingehenden POST-Daten bin Umgang mit

    XMLDocument1.xml.Clear;
    XMLDocument1.Active := True;
    XMLDocument1.XML.text := ARequestInfo.FormParams;

    SynMemo1.Lines.Add(ARequestInfo.FormParams);
    SynMemo1.Lines.Add(#13+#10);

    if XMLDocument1.XML.Count > 0 then
    begin
      XMLDocument1.XML.Delete(0);
      XMLDocument1.XML.Delete(0);

      for i := pred(xmldocument1.xml.count) downto 0 do
      begin
        stmp := XMLDocument1.XML.Strings[i];

        if Length(stmp) > 0 then
        begin
          if Copy(stmp,1,1) = '<' then
            break
          else
            XMLDocument1.XML.Delete(i);
        end
        else
          XMLDocument1.XML.Delete(i);

      end;

      XMLDocument1.XML.Text := StringReplace(XMLDocument1.XML.Text,
        '<Punches ', '<Punches xmlns="http://ats/punch" ', [rfReplaceAll]);



    end;

    Punch := GetPunches(XMLDocument1);

    PunchReply := NewOperationStatus;
    PunchReply.Uid := Punch.Uid;
    PunchReply.NodeValue := 'OK';

    stmp := '<?xml version="1.0" encoding="utf-8"?>' +
      #13+#10 + FormatXMLData(PunchReply.XML);
    SynMemo1.Lines.Add(stmp);
    SynMemo1.Lines.Add(#13+#10);

    AResponseInfo.ContentType := 'text/html';
    AResponseInfo.ContentStream := TStringStream.Create(stmp);

Ich habe wireshark verwendet, um zu sehen, was geschieht und es sieht aus wie indy einen ACK zurück sendet, bevor die Antwort gesendet wird und bewirkt, dass das Client zu trennen.

Dieses ich testen Set-up Apache mit PHP und schrieb ein PHP-Skript, um die gleiche Arbeit zu tun und alles funktioniert ok, Der Unterschied der POST-Daten ist, hat auf die mit dem Antwortinhalt nicht ein ACK.

Alle Vorschläge, wie diese sowie GET auf die POST-Daten, damit ich reagieren zu lösen.


ich damit jetzt bin stecken, wie man es von dieser wireshark Spur sehen (Link klicken für Bild) i erhöht das Timeout auf 20 Sekunden. und es ist immer noch nicht funktioniert. Ich werde ein paar mehr Untersuchungen tun. und sehen, was kann ich herausfinden. Seine sah aus wie Indy die Trenn denkt aufgetreten ist, bevor es

hat

Klicken Sie hier für Bild

War es hilfreich?

Lösung

Sieht aus wie die http gesendet wird als

Transfer-Encoding: chunked

Deshalb gibt es keinen Content-Length. aber die Version von Indy Ich bin mit diesem Modus nicht unterstützt.

Andere Tipps

ACKs nicht von Indy selbst, sondern durch die zugrunde liegende Steckdose statt, und selbst dann nur in Antwort auf Pakete, die von der anderen Partei empfangen gesendet. EIdConnClosedGracefully bedeutet, dass der Kunde absichtlich die Buchse wird Trennen an seinem Ende, bevor der Server gesendet seine Antwortdaten. Die Tatsache, dass ein ACK vorliegt hilft beweisen, dass (die Fassung wahrscheinlich FIN-Paket während der Trennung des Clients wird ACK'ing).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top