tidhttpserver - eidconlocked перед отправкой ответа на пост
-
26-09-2019 - |
Вопрос
У меня проблемы с реализацией 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 присутствует, помогает доказать, что (розетка, скорее всего, указывает плавник клиента во время отключения).