Глобал, потокобезопасен, менеджер куки с Indy
Мое приложение Delphi 2010 загружает данные, используя многопоточность, загруженные данные помещаются в PHP / веб-приложение, которое требует входа в систему, поэтому мне нужно использовать менеджер общих / глобальных файлов cookie (я используюIndy10 Revision 4743), так как TIdCookieManager не является потокобезопасным :(
Кроме того, на стороне сервера, идентификатор сессии автоматически генерируется каждые 5 минут, поэтому яmust сохранить как глобальный & amp; локальные менеджеры печенья в синхронизации.
Мой код выглядит так:
<code>TUploadThread = class(TThread) // ... var GlobalCookieManager : TIdCookieManager; procedure TUploadThread.Upload(FileName : String); var IdHTTP : TIdHTTP; TheSSL : TIdSSLIOHandlerSocketOpenSSL; TheCompressor : TIdCompressorZLib; TheCookieManager : TIdCookieManager; AStream : TIdMultipartFormDataStream; begin ACookieManager := TIdCookieManager.Create(IdHTTP); // Automatically sync cookies between local & global Cookie managers @TheCookieManager.OnNewCookie := pPointer(Cardinal(pPointer( procedure(ASender : TObject; ACookie : TIdCookie; var VAccept : Boolean) begin OmniLock.Acquire; try GlobalCookieManager.CookieCollection.AddCookie(ACookie, TIdHTTP(TIdCookieManager(ASender).Owner).URL{IdHTTP.URL}); finally OmniLock.Release; end; // try/finally VAccept := True; end )^ ) + $0C)^; // ======================================== // IdHTTP := TIdHTTP.Create(nil); with IdHTTP do begin HTTPOptions := [hoForceEncodeParams, hoNoParseMetaHTTPEquiv]; AllowCookies := True; HandleRedirects := True; ProtocolVersion := pv1_1; IOHandler := TheSSL; Compressor := TheCompressor; CookieManager := TheCookieManager; end; // with OmniLock.Acquire; try // Load login info/cookies TheCookieManager.CookieCollection.AddCookies(GlobalCookieManager.CookieCollection); finally OmniLock.Release; end; // try/finally AStream := TIdMultipartFormDataStream.Create; with Stream.AddFile('file_name', FileName, 'application/octet-stream') do begin HeaderCharset := 'utf-8'; HeaderEncoding := '8'; end; // with IdHTTP.Post('https://www.domain.com/post.php', AStream); AStream.Free; end; </code>
Но это не работает! Я получаю это исключение при вызове AddCookies ()
Project MyEXE.exe raised exception class EAccessViolation with message 'Access violation at address 00000000. Read of address 00000000'.
Я также пытался использовать assign (), т.е.
<code> TheCookieManager.CookieCollection.Assign(GlobalCookieManager.CookieCollection); </code>
Но я все еще получаю то же исключение, обычно здесь:
<code> TIdCookieManager.GenerateClientCookies() </code>
Кто-нибудь знает, как это исправить?