Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Интернет и сети
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 02.04.2015, 23:11
CynicRus CynicRus вне форума
Прохожий
 
Регистрация: 26.02.2013
Сообщения: 30
Версия Delphi: Lazarus, XE 3.
Репутация: 10
По умолчанию Проблема с Indy

Приветствую уважаемых форумчан.Использую Delphi XE 3 и входящие в комплект Indy. Задача - ответ на запрос Policy от флеш сокета:
Код:
procedure TPolicyServer.IdTCPServer1Execute(AContext: TIdContext);
var
  strm: TMemoryStream;
  data: TIdBytes;
  s: string;
begin
if AContext.Connection.Connected then
  begin
  strm := TMemoryStream.Create;
  try
    // read until disconnected
    AContext.Connection.IOHandler.ReadStream(strm, -1, True);
    strm.Position := 0;
    ReadTIdBytesFromStream(strm, data, strm.Size);
     //Log('TPolicyServer',BytesToStringRaw(Data));
    s:=BytesToStringRaw(Data);
     if CompareText(trim('<policy-file-request/>'),trim(s)) = 0 then
       begin
       Log('TPolicyServer',BytesToStringRaw(Data));
       Log('TPolicyServer',CrossDomainResponse);
       Sleep(5);
       AContext.Connection.IOHandler.WriteLn(CrossDomainResponse);
       AContext.Connection.Disconnect;
       end;
  finally
    strm.Free;
  end;
end;

запрос принимаю, по идее - должен на него ответить. А по факту, смотрю в сниффере - код отправки вроде отрабатывает, но вместо нужного мне пакета - отправляет 60 байт хлама. 1 раз. Что я делаю не так?
Код:
const
    CrossDomainResponse =
    '<?xml version="1.0"?>'+
    '<!DOCTYPE cross-domain-policy SYSTEM "/xml/dtds/cross-domain-policy.dtd">' +
    '<cross-domain-policy>' +
    '<site-control permitted-cross-domain-policies="master-only"/>' +
    '<allow-access-from domain="*" to-ports="*" />' +
    '<allow-http-request-headers-from domain="*" headers="*" secure="false" />' +
    '</cross-domain-policy>' + #0;

PS: при этом вот такой говнокод работает, но через раз:
Код:
s := AContext.Connection.Socket.ReadLn('*', 5000);
     Log('TPolicyServer',S);
    if TextPos(PAnsiChar(S), '<policy-file-request/>') <> nil then
      begin
      AContext.Connection.Socket.WriteLn(CrossDomainResponse);
      AContext.Connection.Disconnect;
      end;
Ответить с цитированием
  #2  
Старый 03.04.2015, 13:03
CynicRus CynicRus вне форума
Прохожий
 
Регистрация: 26.02.2013
Сообщения: 30
Версия Delphi: Lazarus, XE 3.
Репутация: 10
По умолчанию

Если кому потребуется, то проблема решается вот так:
Код:
procedure TPolicyServer.IdTCPServer1Execute(AContext: TIdContext);
var
  strm: TMemoryStream;
  data: TIdBytes;
  s: string;
begin
  if AContext.Connection.Connected then
  begin
    strm := TMemoryStream.Create;
    try
      // read until disconnected
      AContext.Connection.IOHandler.ReadStream(strm,
        AContext.Connection.IOHandler.InputBuffer.Size, false);
      strm.Position := 0;
      ReadTIdBytesFromStream(strm, data, strm.Size);
      // Log('TPolicyServer',BytesToStringRaw(Data));
      s := BytesToStringRaw(data);
      if CompareText(trim('<policy-file-request/>'), trim(s)) = 0 then
      begin
        Log('TPolicyServer', BytesToStringRaw(data));
        Log('TPolicyServer', CrossDomainResponse);
        AContext.Connection.IOHandler.WriteBufferOpen;
        AContext.Connection.IOHandler.Write(CrossDomainResponse);
        AContext.Connection.IOHandler.WriteBufferFlush;
        AContext.Connection.IOHandler.WriteBufferClose;
        AContext.Connection.Disconnect;
      end;

    finally
      strm.Free;
    end;
  end
  else
    Sleep(10);
end;
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 16:05.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter