質問

私はトラブルデルファイ2007年にインディ10でHTTPサーバを実装したいます。

私はCommandGetイベントのためのシンプルなイベントハンドラを設定している。

データへの返信私は問題なくのparamsおよび送信XMLデータの背中を解析することができますGETメソッドを使用して送信しました。 (以下のコードを参照)

    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);
私は応答がインディで送信されることはありません、代わりにEidConnClosedGracefullyがTIdIOHandler.WriteDirectによって提起されたPOSTを使用して送信されたデータに返信しようとする CheckForDisconnect(真、真)ラインを形成します。ここでは、私が入ってくるPOSTデータを処理しています方法です。

    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);
私は何が起こっているかを確認するためにWiresharkのを使用しているとインディは、応答が送信される前にACKの背中を送信して切断するには、クライアントを引き起こしているように見えます。

、差があるPHPとApacheと同じ仕事をして、すべてがうまく動作するPHPスクリプトを書いたセットアップは、POSTデータは、応答内容とに応答する。このIをテストしていないACKます。

このように私のPOSTデータへの対応だけでなく、GETを解決する方法上の任意の提案。

<時間> あなたはこのwiresharkのトレースから見ることができるように、私は、今、これにこだわって、私はタイムアウトを20秒に増加している(画像のリンクをクリックしてください)。そしてその、まだ動作していません。私はいくつかのより多くの調査をするつもりです。そして、私は見つけることができます参照してください。インディは、それが

は前に切断が発生したと考えてのようにその探し

画像のこちらをクリック

役に立ちましたか?

解決

のように見えます。httpとして送信されています。

Transfer-Encoding: chunked

したがってないコンテンツの長さがありません。しかし、インディ私のバージョンでは、このモードをサポートしていません使用しています。

他のヒント

ACKは唯一、相手から受信したパケットに対する返信でさえ、代わりにインディそれ自体ではなく、根本的なソケットで送信され、されていません。お使いのサーバが応答データを送信される前に、クライアントが意図的にその端にソケットを切断していることをEIdConnClosedGracefully手段。 ACKが存在しているという事実は、(ソケットはおそらく切断中にクライアントのFINパケットをACK'ingている)ことを証明することができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top