Jump to content

Mark Lobanov

  • Content Count

  • Joined

  • Last visited

Community Reputation

1 Neutral
  1. Mark Lobanov

    ICS 8.63 little patch

    Why now fixed ?
  2. Hello, [OverbyteIcsWSocketS.pas] procedure TSslWSocketServer.OrderClose; OLD>> if FIcsHosts.Count = 0 then Exit; NEW>> if (not Assigned( FIcsHosts )) or (FIcsHosts.Count = 0) then Exit;
  3. Mark Lobanov

    TSslHttpCli in multithreading environment

    I applied your advice. Error still occurs
  4. Mark Lobanov

    TSslHttpCli in multithreading environment

    Excuse me, I'm don't understand you (( How I have to correct my code?
  5. Hello I'm trying to use TSslHttpCli in multithreading environment (Parallel Programming Library) and getting an error ESocketException with message 'Invalid argument (#10022 in WSACancelAsyncRequest)’ in Get method. Please, help me. Why does an error occurs? If I'm calling TSslHttpCli.Get in main application thread this error does not occurs. program ics_test; {$APPTYPE CONSOLE} uses Classes, IOUtils, System.Threading, System.SyncObjs, System.SysUtils, OverbyteIcsWndControl, OverbyteIcsHttpProt, OverbyteIcsWSocket; type TSslHttpCliHelper = class strict private hc: TSslHttpCli; fCookie: string; procedure hcOnCookie(Sender: TObject; const Data: String; var Accept: Boolean); function handleHttpResult: string; public procedure doGet; constructor Create; destructor Destroy; override; end; TTestTask = class(TTask) private fHelper: TSslHttpCliHelper; public constructor Create(Sender: TObject; Event: TNotifyEvent; const AProc: TProc; const APool: TThreadPool; const AParent: TTask); destructor Destroy; override; end; function makeFileNameID(Obj: TObject): string; begin Result := IntToHex(Integer( pointer( Obj ) ), 8); end; { TTestTask } constructor TTestTask.Create(Sender: TObject; Event: TNotifyEvent; const AProc: TProc; const APool: TThreadPool; const AParent: TTask); begin inherited Create(Sender, Event, AProc, APool, AParent); fHelper := TSslHttpCliHelper( Sender ); end; destructor TTestTask.Destroy; begin fHelper.Free; inherited; end; { TSslHttpCliHelper } constructor TSslHttpCliHelper.Create; begin hc := TSslHttpCli.Create( nil ); hc.ContentTypePost := 'application/json'; hc.Accept := '*/*'; hc.Connection := 'Keep-Alive'; hc.Agent := 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36'; hc.ResponseNoException := True; // hc.MultiThreaded := True; hc.SendStream := nil; hc.RcvdStream := TBytesStream.Create; hc.OnCookie := hcOnCookie; hc.sslContext := TSslContext.Create( nil ); hc.sslContext.SslMinVersion := sslVerTLS1_2; hc.sslContext.SslMaxVersion := sslVerTLS1_3; end; destructor TSslHttpCliHelper.Destroy; begin hc.SendStream.Free; hc.RcvdStream.Free; hc.SslContext.Free; hc.Free; inherited; end; procedure TSslHttpCliHelper.doGet; begin hc.url := 'https://api.ehealth-ukraine.org/api/dictionaries'; hc.Get; TFile.WriteAllText('test.'+makeFileNameID( Self )+'.json', handleHttpResult, TEncoding.UTF8); end; function TSslHttpCliHelper.handleHttpResult: string; begin if Assigned( hc.RcvdStream ) and (hc.RcvdStream.Size > 0) then Result := Trim( TEncoding.UTF8.GetString( TBytesStream( hc.RcvdStream ).Bytes ) ) else Result := EmptyStr; end; procedure TSslHttpCliHelper.hcOnCookie(Sender: TObject; const Data: String; var Accept: Boolean); begin fCookie := Data; Accept := True; end; function createTask(ATaskHelper: TSslHttpCliHelper): TTestTask; begin Result := TTestTask.Create(ATaskHelper, nil, procedure() begin ATaskHelper.doGet; end, TThreadPool.Default, nil); end; var tasks: array of ITask; task: ITask; hlp: TSslHttpCliHelper; begin { // Normal hlp := TSslHttpCliHelper.Create; try hlp.doGet; finally hlp.Free; end; } { --------------------------- Debugger Exception Notification --------------------------- Project ics_test.exe raised exception class ESocketException with message 'Invalid argument (#10022 in WSACancelAsyncRequest)'. --------------------------- Break Continue Help --------------------------- } SetLength(tasks, 1); tasks[0] := createTask( TSslHttpCliHelper.Create ); for task in tasks do task.Start; TTask.WaitForAll( tasks ); SetLength(tasks, 0); end. I use Delphi Tokyo 25.0.29899.2631 and ICS 8.61 An example in attachment. ics_test.zip