@@ -73,8 +73,15 @@ TRequest = class;
7373 end ;
7474
7575 THttpClientBase = class (TInterfacedObject)
76+ protected
77+ FConnectionTimeout: Integer;
78+ FSendTimeout: Integer;
79+ FResponseTimeout: Integer;
7680 public
7781 procedure ReleaseRequest (const request : TRequest);virtual ;abstract ;
82+ property ConnectionTimeout: Integer read FConnectionTimeout write FConnectionTimeout;
83+ property SendTimeout: Integer read FSendTimeout write FSendTimeout;
84+ property ResponseTimeout: Integer read FResponseTimeout write FResponseTimeout;
7885 end ;
7986
8087
@@ -97,6 +104,10 @@ TRequest = class
97104 FProxyUserName : string;
98105 FProxyPassword : string;
99106
107+ FConnectionTimeout: Integer;
108+ FSendTimeout: Integer;
109+ FResponseTimeout: Integer;
110+
100111 FURI : IUri;
101112 protected
102113 function GetHeaders : TStrings;
@@ -203,6 +214,11 @@ TRequest = class
203214 property Passsword : string read FPassword write FPassword;
204215 property ProxyUserName : string read FProxyUserName write FProxyUserName;
205216 property ProxyPassword : string read FProxyPassword write FProxyPassword;
217+
218+ property ConnectionTimeout: Integer read FConnectionTimeout write FConnectionTimeout;
219+ property SendTimeout: Integer read FSendTimeout write FSendTimeout;
220+ property ResponseTimeout: Integer read FResponseTimeout write FResponseTimeout;
221+
206222 end ;
207223
208224
@@ -233,6 +249,15 @@ TRequest = class
233249 function GetPassword : string;
234250 procedure SetPassword (const value : string);
235251
252+ function GetConnectionTimeout : integer;
253+ procedure SetConnectionTimeout (const value : integer);
254+
255+ function GetSendTimeout : integer;
256+ procedure SetSendTimeout (const value : integer);
257+
258+ function GetResponseTimeout : integer;
259+ procedure SetResponseTimeout (const value : integer);
260+
236261 function CreateRequest (const resource : string) : TRequest;overload;
237262 function CreateRequest (const uri : IUri) : TRequest;overload;
238263
@@ -246,13 +271,31 @@ TRequest = class
246271 property UserName : string read GetUserName write SetUserName;
247272 property Password : string read GetPassword write SetPassword;
248273
274+ property ConnectionTimeout: Integer read GetConnectionTimeout write SetConnectionTimeout;
275+ property SendTimeout: Integer read GetSendTimeout write SetSendTimeout;
276+ property ResponseTimeout: Integer read GetResponseTimeout write SetResponseTimeout;
277+
278+
249279 property UseHttp2 : boolean read GetUseHttp2 write SetUseHttp2;
280+
281+
250282 end ;
251283
252284 THttpClientFactory = class
253- class function CreateClient (const uri: string): IHttpClient;overload;
254- class function CreateClient (const uri: IUri): IHttpClient;overload;
285+ private
286+ class
287+ var
288+ FDefaultConnectionTimeout: Integer;
289+ FDefaultSendTimeout: Integer;
290+ FDefaultResponseTimeout: Integer;
291+ class constructor Create;
292+ public
293+ class function CreateClient (const uri: string): IHttpClient;overload;
294+ class function CreateClient (const uri: IUri): IHttpClient;overload;
255295
296+ class property DefaultConnectionTimeout: Integer read FDefaultConnectionTimeout write FDefaultConnectionTimeout;
297+ class property DefaultSendTimeout: Integer read FDefaultSendTimeout write FDefaultSendTimeout;
298+ class property DefaultResponseTimeout: Integer read FDefaultResponseTimeout write FDefaultResponseTimeout;
256299 end ;
257300
258301 EHttpClientException = class (Exception)
@@ -402,6 +445,9 @@ constructor TRequest.Create(const client: THttpClientBase; const uri: IUri);
402445 for queryParam in uri.QueryParams do
403446 WithParameter(queryParam.Name , queryParam.Value );
404447 end ;
448+ FConnectionTimeout := client.ConnectionTimeout;
449+ FSendTimeout := client.SendTimeout;
450+ FResponseTimeout := client.ResponseTimeout;
405451end ;
406452
407453function CombineUriParts (const a, b : string) : string;
@@ -596,6 +642,7 @@ function TRequest.GetCharSet: string;
596642 result := ' ' ;
597643end ;
598644
645+
599646function TRequest.GetContentLength : Int64;
600647var
601648 stream : TStream;
@@ -627,6 +674,7 @@ function TRequest.GetResource: string;
627674 result := FURI.AbsolutePath;
628675end ;
629676
677+
630678function TRequest.GetUrlSegments : TStrings;
631679begin
632680 result := FUrlSegments;
@@ -776,6 +824,7 @@ procedure TRequest.SetAcceptLanguage(const value: string);
776824 FHeaders.Values[cAcceptLanguageHeader] := value ;
777825end ;
778826
827+
779828procedure TRequest.SetContentType (const value : string);
780829begin
781830 FHeaders.Values[cContentTypeHeader] := value ;
@@ -787,6 +836,7 @@ procedure TRequest.SetResource(const value: string);
787836end ;
788837
789838
839+
790840function TRequest.WillFollowRedirects : TRequest;
791841begin
792842 FFollowRedirects := true;
@@ -907,13 +957,23 @@ class function THttpClientFactory.CreateClient(const uri : string): IHttpClient;
907957begin
908958 if not TUriFactory.TryParseWithError(uri, true, theUri, error) then
909959 raise EArgumentOutOfRangeException.Create(' Invalid Uri : ' + error );
960+ result := THttpClientFactory.CreateClient(theUri);
961+ end ;
910962
911- result := THttpClient.Create(theUri);
963+ class constructor THttpClientFactory.Create;
964+ begin
965+ // 1min defaults
966+ FDefaultConnectionTimeout := 60000 ;
967+ FDefaultSendTimeout := 60000 ;
968+ FDefaultResponseTimeout := 60000 ;
912969end ;
913970
914971class function THttpClientFactory.CreateClient (const uri: IUri): IHttpClient;
915972begin
916973 result := THttpClient.Create(uri);
974+ result.ConnectionTimeout := FDefaultConnectionTimeout;
975+ result.SendTimeout := FDefaultSendTimeout;
976+ result.ResponseTimeout := FDefaultResponseTimeout;
917977end ;
918978
919979{ EHttpClientException }
0 commit comments