@@ -35,6 +35,7 @@ THttpClient = class(THttpClientBase, IHttpClient, IHttpClientInternal)
3535 FBytesWritten : DWORD;
3636 FClientError : DWORD;
3737 FUseHttp2 : boolean;
38+ FEnableTLS1_3 : boolean;
3839 FAllowSelfSignedCertificates : boolean;
3940 FLastStatusCode : DWORD;
4041 FProxyAuthScheme : DWORD;
@@ -78,6 +79,9 @@ THttpClient = class(THttpClientBase, IHttpClient, IHttpClientInternal)
7879
7980 function GetUseHttp2 : boolean;
8081 procedure SetUseHttp2 (const value : boolean);
82+ function GetEnableTLS1_3 : boolean;
83+ procedure SetEnableTLS1_3 (const value : boolean);
84+
8185
8286 function GetConnectionTimeout : integer;
8387 procedure SetConnectionTimeout (const value : integer);
@@ -211,6 +215,7 @@ constructor THttpClient.Create(const uri : IUri);
211215 FUri := uri;
212216 FUserAgent := ' VSoft.HttpClient' ;
213217 FWaitEvent := TEvent.Create(nil ,false, false,' ' );
218+ FEnableTLS1_3 := false;
214219end ;
215220
216221
@@ -264,6 +269,11 @@ function THttpClient.GetConnectionTimeout: integer;
264269 result := FConnectionTimeout;
265270end ;
266271
272+ function THttpClient.GetEnableTLS1_3 : boolean;
273+ begin
274+ result := FEnableTLS1_3;
275+ end ;
276+
267277function THttpClient.GetPassword : string;
268278begin
269279 result := FPassword;
@@ -626,7 +636,6 @@ procedure THttpClient.ReleaseRequest(const request: TRequest);
626636
627637const WAIT_OBJECT_1 = WAIT_OBJECT_0 + 1 ;
628638
629- const tlsProtocols : DWORD = WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_2 + WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_3;
630639
631640
632641// simple get/post etc.
@@ -651,6 +660,9 @@ function THttpClient.Send(const request: TRequest; const cancellationToken: ICan
651660
652661 sResource : string;
653662 hr : DWORD;
663+ tlsProtocols : DWORD;
664+
665+
654666begin
655667 if FCurrentRequest <> nil then
656668 raise Exception.Create(' A request is in progress.. winhttp is not reentrant!' );
@@ -663,11 +675,14 @@ function THttpClient.Send(const request: TRequest; const cancellationToken: ICan
663675 FBytesWritten := 0 ;
664676 FCurrentRequest := request;
665677 EnsureSession;
678+ tlsProtocols := WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_2;
679+ if FEnableTLS1_3 then
680+ tlsProtocols := tlsProtocols + WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_3;
666681
667682 if not WinHttpSetOption(FSession, WINHTTP_OPTION_SECURE_PROTOCOLS, @tlsProtocols, sizeof(tlsProtocols)) then
668683 begin
669684 FClientError := GetLastError;
670- raise EHttpClientException.Create(ClientErrorToString(FClientError), FClientError);
685+ raise EHttpClientException.Create(ClientErrorToString(' Error setting secure protocol options ' , FClientError), FClientError);
671686 end ;
672687
673688
@@ -684,7 +699,7 @@ function THttpClient.Send(const request: TRequest; const cancellationToken: ICan
684699 if not WinHttpCrackUrl(PWideChar(FUri.BaseUriString), 0 , 0 , urlComp ) then
685700 begin
686701 FClientError := GetLastError;
687- raise EHttpClientException.Create(ClientErrorToString(FClientError), FClientError);
702+ raise EHttpClientException.Create(ClientErrorToString(' Error parsing Uri ' , FClientError), FClientError);
688703 end ;
689704
690705 SetString(host, urlComp.lpszHostName, urlComp.dwHostNameLength);
@@ -693,7 +708,7 @@ function THttpClient.Send(const request: TRequest; const cancellationToken: ICan
693708 if hConnection = nil then
694709 begin
695710 FClientError := GetLastError;
696- raise EHttpClientException.Create(ClientErrorToString(FClientError), FClientError);
711+ raise EHttpClientException.Create(ClientErrorToString(' Error connecting ' , FClientError), FClientError);
697712 end ;
698713
699714 option := 0 ;
@@ -703,7 +718,7 @@ function THttpClient.Send(const request: TRequest; const cancellationToken: ICan
703718 if not WinHttpSetOption(hConnection,WINHTTP_OPTION_ENABLE_HTTP_PROTOCOL, @option, SizeOf(DWORD)) then
704719 begin
705720 FClientError := GetLastError;
706- raise EHttpClientException.Create(ClientErrorToString(FClientError), FClientError);
721+ raise EHttpClientException.Create(ClientErrorToString(' Error setting http options ' , FClientError), FClientError);
707722 end ;
708723
709724 dwOpenRequestFlags := WINHTTP_FLAG_REFRESH + WINHTTP_FLAG_ESCAPE_PERCENT;
@@ -718,7 +733,7 @@ function THttpClient.Send(const request: TRequest; const cancellationToken: ICan
718733 if hRequest = nil then
719734 begin
720735 FClientError := GetLastError;
721- raise EHttpClientException.Create(ClientErrorToString(FClientError), FClientError);
736+ raise EHttpClientException.Create(ClientErrorToString(' Error opening request ' , FClientError), FClientError);
722737 end ;
723738
724739 if WinHttpSetTimeouts(hRequest, request.ConnectionTimeout, request.ConnectionTimeout, request.SendTimeout, request.ResponseTimeout) = False then
@@ -783,7 +798,7 @@ function THttpClient.Send(const request: TRequest; const cancellationToken: ICan
783798 // if all is ok, then return the response.
784799 if FClientError <> 0 then
785800 begin
786- raise EHttpClientException.Create(ClientErrorToString(FClientError), FClientError);
801+ raise EHttpClientException.Create(ClientErrorToString(' ' , FClientError), FClientError);
787802 // raise exception?
788803 end ;
789804
@@ -793,15 +808,15 @@ function THttpClient.Send(const request: TRequest; const cancellationToken: ICan
793808 WAIT_OBJECT_1 :
794809 begin
795810 // cancellation token triggered
796- raise EHttpClientException.Create(ClientErrorToString(FClientError), FClientError);
811+ raise EHttpClientException.Create(ClientErrorToString(' ' , FClientError), FClientError);
797812
798813 FResponse := nil ;
799814 exit;
800815 end ;
801816 WAIT_TIMEOUT :
802817 begin
803818 // timed out, clean up and return.
804- raise EHttpClientException.Create(ClientErrorToString(ERROR_WINHTTP_TIMEOUT), ERROR_WINHTTP_TIMEOUT);
819+ raise EHttpClientException.Create(ClientErrorToString(' Timed out ' , ERROR_WINHTTP_TIMEOUT), ERROR_WINHTTP_TIMEOUT);
805820 FResponse := nil ;
806821 exit;
807822 end ;
@@ -837,6 +852,11 @@ procedure THttpClient.SetConnectionTimeout(const value: integer);
837852 FConnectionTimeout := value ;
838853end ;
839854
855+ procedure THttpClient.SetEnableTLS1_3 (const value : boolean);
856+ begin
857+ FEnableTLS1_3 := false;
858+ end ;
859+
840860procedure THttpClient.SetPassword (const value : string);
841861begin
842862 FPassword := value ;
0 commit comments