tIdHttpServer - EidConnClosed перед отправкой ответа на POST - PullRequest
1 голос
/ 06 августа 2010

У меня проблемы с реализацией HTTP-сервера с indy 10 в delphi 2007.

Я установил простой обработчик событий для события CommandGet.

При ответе на данные, отправленные с использованиемПОЛУЧИТЬ метод Я могу разобрать параметры и отправить XML-данные обратно без проблем.(см. код ниже)

    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);

Когда я пытаюсь ответить на данные, отправленные с использованием POST, ответ никогда не отправляется indy, вместо этого TIdIOHandler вызывает EidConnClosedGracefully.Правда) линия.вот как я обрабатываю входящие данные 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, чтобы увидеть, что происходит, и похоже, что indy отправляет ACK обратно перед отправкой ответа и вызывает отключение клиента.

чтобы проверить это, я настроил Apache с PHP и написал PHP-скрипт для выполнения той же работы, и все работает нормально. Разница в том, что на данные POST отвечают с содержимым ответа, а не ACK.

любые предложения о том, как решить эту проблему, чтобы я отвечал на данные POST, а также на GET.


Я застрял с этим сейчас, как вы можете видеть из этого следа проволочной акулы (нажмите на ссылку для изображения), я увеличил время ожидания до 20 секунд.и все еще не работает.Я собираюсь сделать еще несколько расследований.и посмотрим, что я смогу узнать.Похоже, Indy думает, что разъединение произошло до того, как оно

Нажмите здесь для изображения

Ответы [ 2 ]

2 голосов
/ 09 августа 2010

Похоже, http отправляется как

Transfer-Encoding: chunked

Следовательно, длина контента отсутствует. но версия Indy, которую я использую, не поддерживает этот режим.

0 голосов
/ 08 августа 2010

ACK отправляются не самим Indy, а соответствующим сокетом, и даже тогда, только в ответ на пакеты, полученные от другой стороны. EIdConnClosedGracefully означает, что клиент намеренно отключает сокет на своем конце, прежде чем ваш сервер сможет отправить свои данные ответа. Тот факт, что ACK присутствует, помогает доказать это (сокет, вероятно, ACK ', находящийся в пакете FIN клиента во время отключения).

...