Приветствую уважаемых форумчан.Использую 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;