Joe Sansalone 6 Posted March 11, 2022 Hi, (Delphi 11, also tried Delphi 10.4) I'm running an application 24/7 that works for a few weeks and then gets STUCK waiting for a response from executing a REST Client Request. No exception. No timeout. Does not return from FRESTRequest.Execute The server that is being Requested, gets the request AND does respond. Below is the code. The ModifyCall procedure gets executed many times and works before hitting this problem. Sometimes restarting the application is not enough to fix the problem. I need to restart windows! 1. Can I force a max timeout? So that if it gets stuck, at least I can handle the timeout. 2. Any idea why this would occur? Joe constructor TTwilioAPI.Create(aAccountSID, aPassword: string); begin inherited Create; FTwiML := TTwilioML.Create; FAccountSID := aAccountSID; FPassword := aPassword; FRESTClient := TRESTClient.Create('https://api.twilio.com/2010-04-01'); FRESTRequest := TRESTRequest.Create(FRESTClient); FRESTResponse := TRESTResponse.Create(FRESTClient); FHTTPBasicAuthenticator := THTTPBasicAuthenticator.Create(FAccountSID, FPassword); FRESTClient.Authenticator := FHTTPBasicAuthenticator; FRESTRequest.Client := FRESTClient; FRESTRequest.Response := FRESTResponse; FRESTClient.ContentType := 'application/x-www-form-urlencoded'; FRESTClient.SecureProtocols := [THTTPSecureProtocol.TLS12, THTTPSecureProtocol.TLS11, THTTPSecureProtocol.TLS1]; FBaseURL := cBaseURL; // default end; function TTwilioAPI.ModifyCall(aTwiML, aCallSid: string; sync: boolean = false): boolean; var statusCode: integer; begin result := True; FRESTRequest.Params.Clear; FRestRequest.Resource := '/Accounts/{AccountSid}/Calls/{Sid}.json'; FRestRequest.Params.AddItem('AccountSid', FAccountSID, TRestRequestParameterKind.pkURLSEGMENT); FRestRequest.Params.AddItem('Sid', aCallSid, TRestRequestParameterKind.pkURLSEGMENT); FRestRequest.Params.AddItem('Twiml', aTwiML, TRestRequestParameterKind.pkGETorPOST); FRESTRequest.Method := rmPOST; try FRESTRequest.Execute; <=============== does not Return from this except on E:EHTTPProtocolException do begin if Assigned(FLog) then FLog.WriteTimeStamp(lctHTTP, lptImportant, 'ModifyCall API: error executing request'); result := false; raise ETwilioCallError.Create('HTTP protocol exception'); end; on E:ERESTException do begin if Assigned(FLog) then FLog.WriteTimeStamp(lctHTTP, lptImportant, 'ModifyCall API: ERESTException'); result := false; raise ETwilioCallError.Create('HTTP protocol exception'); end; end; statusCode := FRESTResponse.StatusCode; //TODO: IF 400 or 500 raise Exception ETwilioError FResponseData := TJSON.JsonToObject<TTwilioResponseObj>(TranslateJsonNames(FRESTResponse.Content)); if Assigned(FLog) then FLog.WriteTimeStamp(lctHTTP, lptNormal, 'ModifyCall API response: status: ' + FResponseData.status + ' sid(call): ' + FResponseData.sid + ' statusCode: ' + InttoStr(statusCode) + ' raw response:' + FRESTResponse.Content + ' message: ' + FResponseData.msg); if (statusCode = 400) then begin if Pos('Call is already in transferring', FResponseData.msg) > 0 then begin if Assigned(FLog) then FLog.WriteTimeStamp(lctHTTP, lptImportant, 'ModifyCall API - BUG'); end; if Pos('Call is not in_progress', FResponseData.msg) > 0 then raise ETwilioHungup.Create('No call in progress') else raise ETwilioCallError.Create('status code 400'); end; end; Share this post Link to post