This is an automated email from the ASF dual-hosted git repository. jensg pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/thrift.git
commit 20e727e67a2b763bb30e09be65676e6598908830 Author: Jens Geyer <je...@apache.org> AuthorDate: Fri Jun 22 22:39:57 2018 +0200 THRIFT-4589 HTTP client timeouts are a) incomplete and b) not used at all Client: Delphi Patch: Jens Geyer --- lib/delphi/src/Thrift.Transport.pas | 119 +++++++++++++++++++++++++----------- 1 file changed, 84 insertions(+), 35 deletions(-) diff --git a/lib/delphi/src/Thrift.Transport.pas b/lib/delphi/src/Thrift.Transport.pas index 997f406..dad9ab7 100644 --- a/lib/delphi/src/Thrift.Transport.pas +++ b/lib/delphi/src/Thrift.Transport.pas @@ -118,14 +118,21 @@ type TTransportExceptionInterrupted = class (TTransportExceptionSpecialized); IHTTPClient = interface( ITransport ) - ['{0F5DB8AB-710D-4338-AAC9-46B5734C5057}'] + ['{BA142D12-8AE6-4B50-9E33-6B7843B21D73}'] + procedure SetDnsResolveTimeout(const Value: Integer); + function GetDnsResolveTimeout: Integer; procedure SetConnectionTimeout(const Value: Integer); function GetConnectionTimeout: Integer; + procedure SetSendTimeout(const Value: Integer); + function GetSendTimeout: Integer; procedure SetReadTimeout(const Value: Integer); function GetReadTimeout: Integer; function GetCustomHeaders: IThriftDictionary<string,string>; procedure SendRequest; + + property DnsResolveTimeout: Integer read GetDnsResolveTimeout write SetDnsResolveTimeout; property ConnectionTimeout: Integer read GetConnectionTimeout write SetConnectionTimeout; + property SendTimeout: Integer read GetSendTimeout write SetSendTimeout; property ReadTimeout: Integer read GetReadTimeout write SetReadTimeout; property CustomHeaders: IThriftDictionary<string,string> read GetCustomHeaders; end; @@ -135,7 +142,9 @@ type FUri : string; FInputStream : IThriftStream; FOutputStream : IThriftStream; + FDnsResolveTimeout : Integer; FConnectionTimeout : Integer; + FSendTimeout : Integer; FReadTimeout : Integer; FCustomHeaders : IThriftDictionary<string,string>; @@ -148,13 +157,20 @@ type procedure Write( const pBuf : Pointer; off, len : Integer); override; procedure Flush; override; + procedure SetDnsResolveTimeout(const Value: Integer); + function GetDnsResolveTimeout: Integer; procedure SetConnectionTimeout(const Value: Integer); function GetConnectionTimeout: Integer; + procedure SetSendTimeout(const Value: Integer); + function GetSendTimeout: Integer; procedure SetReadTimeout(const Value: Integer); function GetReadTimeout: Integer; + function GetCustomHeaders: IThriftDictionary<string,string>; procedure SendRequest; + property DnsResolveTimeout: Integer read GetDnsResolveTimeout write SetDnsResolveTimeout; property ConnectionTimeout: Integer read GetConnectionTimeout write SetConnectionTimeout; + property SendTimeout: Integer read GetSendTimeout write SetSendTimeout; property ReadTimeout: Integer read GetReadTimeout write SetReadTimeout; property CustomHeaders: IThriftDictionary<string,string> read GetCustomHeaders; public @@ -458,16 +474,17 @@ end; { THTTPClientImpl } -procedure THTTPClientImpl.Close; -begin - FInputStream := nil; - FOutputStream := nil; -end; - constructor THTTPClientImpl.Create(const AUri: string); begin inherited Create; FUri := AUri; + + // defaults according to MSDN + FDnsResolveTimeout := 0; // no timeout + FConnectionTimeout := 60 * 1000; + FSendTimeout := 30 * 1000; + FReadTimeout := 30 * 1000; + FCustomHeaders := TThriftDictionaryImpl<string,string>.Create; FOutputStream := TThriftStreamAdapterDelphi.Create( TMemoryStream.Create, True); end; @@ -475,13 +492,18 @@ end; function THTTPClientImpl.CreateRequest: IXMLHTTPRequest; var pair : TPair<string,string>; + srvHttp : IServerXMLHTTPRequest; begin {$IF CompilerVersion >= 21.0} - Result := CoXMLHTTP.Create; + Result := CoServerXMLHTTP.Create; {$ELSE} Result := CoXMLHTTPRequest.Create; {$IFEND} + // setting a timeout value to 0 (zero) means "no timeout" for that setting + if Supports( result, IServerXMLHTTPRequest, srvHttp) + then srvHttp.setTimeouts( DnsResolveTimeout, ConnectionTimeout, SendTimeout, ReadTimeout); + Result.open('POST', FUri, False, '', ''); Result.setRequestHeader( 'Content-Type', 'application/x-thrift'); Result.setRequestHeader( 'Accept', 'application/x-thrift'); @@ -498,14 +520,14 @@ begin inherited; end; -procedure THTTPClientImpl.Flush; +function THTTPClientImpl.GetDnsResolveTimeout: Integer; begin - try - SendRequest; - finally - FOutputStream := nil; - FOutputStream := TThriftStreamAdapterDelphi.Create( TMemoryStream.Create, True); - end; + Result := FDnsResolveTimeout; +end; + +procedure THTTPClientImpl.SetDnsResolveTimeout(const Value: Integer); +begin + FDnsResolveTimeout := Value; end; function THTTPClientImpl.GetConnectionTimeout: Integer; @@ -513,6 +535,31 @@ begin Result := FConnectionTimeout; end; +procedure THTTPClientImpl.SetConnectionTimeout(const Value: Integer); +begin + FConnectionTimeout := Value; +end; + +function THTTPClientImpl.GetSendTimeout: Integer; +begin + Result := FSendTimeout; +end; + +procedure THTTPClientImpl.SetSendTimeout(const Value: Integer); +begin + FSendTimeout := Value; +end; + +function THTTPClientImpl.GetReadTimeout: Integer; +begin + Result := FReadTimeout; +end; + +procedure THTTPClientImpl.SetReadTimeout(const Value: Integer); +begin + FReadTimeout := Value; +end; + function THTTPClientImpl.GetCustomHeaders: IThriftDictionary<string,string>; begin Result := FCustomHeaders; @@ -523,14 +570,26 @@ begin Result := True; end; -function THTTPClientImpl.GetReadTimeout: Integer; +procedure THTTPClientImpl.Open; begin - Result := FReadTimeout; + FOutputStream := TThriftStreamAdapterDelphi.Create( TMemoryStream.Create, True); end; -procedure THTTPClientImpl.Open; +procedure THTTPClientImpl.Close; begin - // nothing to do + FInputStream := nil; + FOutputStream := nil; +end; + +procedure THTTPClientImpl.Flush; +begin + try + SendRequest; + finally + FOutputStream := nil; + FOutputStream := TThriftStreamAdapterDelphi.Create( TMemoryStream.Create, True); + ASSERT( FOutputStream <> nil); + end; end; function THTTPClientImpl.Read( const pBuf : Pointer; const buflen : Integer; off: Integer; len: Integer): Integer; @@ -572,16 +631,6 @@ begin end; end; -procedure THTTPClientImpl.SetConnectionTimeout(const Value: Integer); -begin - FConnectionTimeout := Value; -end; - -procedure THTTPClientImpl.SetReadTimeout(const Value: Integer); -begin - FReadTimeout := Value -end; - procedure THTTPClientImpl.Write( const pBuf : Pointer; off, len : Integer); begin FOutputStream.Write( pBuf, off, len); @@ -1038,12 +1087,6 @@ end; { TStreamTransportImpl } -procedure TStreamTransportImpl.Close; -begin - FInputStream := nil; - FOutputStream := nil; -end; - constructor TStreamTransportImpl.Create( const AInputStream : IThriftStream; const AOutputStream : IThriftStream); begin inherited Create; @@ -1058,6 +1101,12 @@ begin inherited; end; +procedure TStreamTransportImpl.Close; +begin + FInputStream := nil; + FOutputStream := nil; +end; + procedure TStreamTransportImpl.Flush; begin if FOutputStream = nil then begin