|
#1
|
|||
|
|||
Проблема с 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
|
|||
|
|||
Если кому потребуется, то проблема решается вот так:
Код:
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; |