[SOLVED] synapse: how to get a timeout for http-downloads to work? lazarus / 38-Networking and Web Programming ---------------------------------------------------------------------- Hartmut · 2022-12-08 11:22 My program shall download a website with synapse. Sometimes this website is not available. Then my code runs into a timeout of 130 seconds, which is too much. I want a timeout of max. 4 seconds. Here is a demo of my code from a bigger program: Code: Pascal  [Select][+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i {$mode objfpc}{$H+} uses sysutils, classes, httpsend; const URL = 'http://xxx.yyy.com'; function myHttpGetText(url: string; HTTP: THTTPSend; var SL: TStringList): boolean;   {loads URL 'url' from a Webserver into a StringList}   var ok: boolean;   begin   ok:=false;   SL:=TStringList.Create;   HTTP.Clear; {Reset headers, document and Mimetype}    if HTTP.HTTPMethod('GET',url) then       begin       SL.LoadFromStream(HTTP.Document);       ok:=true;       end;   exit(ok);   end; function download_Website(url: string; var SL: TStringList): boolean;   var HTTP: THTTPSend;       ok: boolean;   begin   HTTP:=THTTPSend.Create;   HTTP.Timeout:=4000;   HTTP.Sock.SetTimeout(4000);   ok:=myHttpGetText(url, HTTP, SL);   HTTP.Free;   exit(ok);   end; var SL: TStringList;    t: TDateTime;  sec: double;    ok: boolean; begint:=now;ok:=download_Website(URL, SL);sec:=(now-t)*86400.0; {time in seconds}writeln('Time: ', sec:0:2, ' seconds'); if not ok then writeln('ERROR') else writeln(SL.Text);SL.Free;end. I use FPC 3.2.0 on Linux Ubuntu 18.04 with synapse stable version 40 and trunk r266 (both have the same result). What I'm doing wrong? Thanks in advance. ---------------------------------------------------------------------- balazsszekely · 2022-12-08 14:00 @Hartmut On windows immediately returns with the message "Error". I don't have to wait even 4 seconds. ---------------------------------------------------------------------- Hartmut · 2022-12-08 15:25 Thank you GetMem for your reply. Yes, if the URL does not exist at all, then immediately "ERROR" is returned. But with my real URL - if it is currently unavailable - then I have a timeout of 130 seconds, which is too long for me. ---------------------------------------------------------------------- rvk · 2022-12-08 15:27 You probably want to set HTTP.Sock.ConnectionTimeout to whatever you want. See my post here: Quote from: rvk on February 21, 2018, 09:48:45 amSorry, I spoke too soon. What is said above still holds but the connect timeout was discussed on the Synapse list in 2012 and the non-blockingmode (which is mentioned above) was implemented in revision #160. You also need to set the HTTPSender.Sock.ConnectionTimeout which handles the Connect timeout in non-blockingmode after which the socket is switched back to blocking mode. Example: Code: Pascal  [Select][+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i const  URL = '10.255.255.1'; // <-- this is always non responsevar  HTTPSender: THTTPSend;  HTTPGetResult: boolean;  Tm: TDateTime;begin  HTTPSender := THTTPSend.Create;  try    HTTPSender.Timeout := 1 * 1000;    HTTPSender.Sock.ConnectionTimeout := 1 * 1000;    Tm := Now;    HTTPGetResult := HTTPSender.HTTPMethod('GET', URL);    Tm := Now - Tm;    ShowMessage(Format('%d: done in %.3f seconds', [HTTPSender.ResultCode, Tm * 24 * 60 * 60]));  finally    HTTPSender.Free;  end;end; PS. When ConnectionTimeOut > 0 then Synapse will connect in non- blocking mode. In blocking mode (the default) there is no way to set the timeout. See http://www.ararat.cz/synapse/doku.php/public:howto:connecttimeout ---------------------------------------------------------------------- Hartmut · 2022-12-08 16:51 Great! 'HTTPSender.Sock.ConnectionTimeout' works perfectly. Thanks a lot rvk. Again I like synapse and it's capabilities.