Вопрос

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

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

При ответе на данные, отправленные с использованием метода Get, я могу проанализировать параметры и отправить данные 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);

Когда я пытаюсь ответить на данные, которые отправляются с использованием поста, ответ никогда не отправляется Indy, вместо Eidconnlockgracegrace, поднимается TIDIOHANDLER.WRITIONITORECT, образуя функцию CheckFordisconnect (True, True) Line. Вот как я обрабатывающую входящие данные

    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-скрипт, чтобы сделать ту же работу, и все работает нормально, разница в том, что данные поступили с ответом контента, а не ACK.

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


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

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

Это было полезно?

Решение

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

Transfer-Encoding: chunked

Поэтому нет длины содержимого. Но версия Indy I использует, не поддерживает этот режим.

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top